我有一個資料框1:
ID Var1 Var2
1 40 45
2 30 35
3 70 65
4 70 15
5 40 15
6 80 45
7 20 15
8 20 15
9 50 35
10 70 25
我有第二個資料框2:
ID Error
1 0
2 1
5 1
6 1
9 0
10 NA
21 0
22 NA
我想在 dataframe1 中創建一個標記為“錯誤”的新列,除了在 dataframe2 中列出錯誤的 ID 或在 dataframe2 中列出的 NA 之外,所有內容均為 0。輸出將是:
ID Var1 Var2 Error
1 40 45 0
2 30 35 1
3 70 65 0
4 70 15 0
5 40 15 1
6 80 45 1
7 20 15 0
8 20 15 0
9 50 35 0
10 70 25 NA
uj5u.com熱心網友回復:
另一種解決方案:
library(tidyverse)
df1 <- data.frame(
ID = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L),
Var1 = c(40L, 30L, 70L, 70L, 40L, 80L, 20L, 20L, 50L, 70L),
Var2 = c(45L, 35L, 65L, 15L, 15L, 45L, 15L, 15L, 35L, 25L)
)
df2 <- data.frame(
ID = c(1L, 2L, 5L, 6L, 9L, 10L),
Error = c(0L, 1L, 1L, 1L, 0L, NA)
)
df2 %>%
mutate(Error = replace_na(.$Error,55)) %>%
left_join(df1, .) %>%
mutate(Error = replace_na(.$Error,0)) %>%
mutate(Error = ifelse(.$Error==55,NA,.$Error))
#> Joining, by = "ID"
#> ID Var1 Var2 Error
#> 1 1 40 45 0
#> 2 2 30 35 1
#> 3 3 70 65 0
#> 4 4 70 15 0
#> 5 5 40 15 1
#> 6 6 80 45 1
#> 7 7 20 15 0
#> 8 8 20 15 0
#> 9 9 50 35 0
#> 10 10 70 25 NA
uj5u.com熱心網友回復:
這是使用 的另一個選項tibble::deframe,它將變成df2名稱為ID且值為的命名向量Error:
library(dplyr)
df1 %>%
mutate(Error = ifelse(ID %in% df2$ID, tibble::deframe(df2)[as.character(ID)], 0))
基礎 R 中的類似解決方案是:
lookup <- with(df2, setNames(Error, ID))
within(df1, Error <- ifelse(ID %in% df2$ID, lookup[as.character(ID)], 0))
輸出
ID Var1 Var2 Error
1 1 40 45 0
2 2 30 35 1
3 3 70 65 0
4 4 70 15 0
5 5 40 15 1
6 6 80 45 1
7 7 20 15 0
8 8 20 15 0
9 9 50 35 0
10 10 70 25 NA
uj5u.com熱心網友回復:
在第二個資料中為NA值創建一個邏輯向量以區分NA,然后進行連接,以便邏輯列區分初始 NA 與中創建的那些left_join
library(dplyr)
df2 %>%
mutate(yes = is.na(Error)) %>%
left_join(df1, .) %>%
mutate(Error = case_when(is.na(yes) &
is.na(Error) ~ 0L, TRUE ~ Error), yes = NULL)
-輸出
ID Var1 Var2 Error
1 1 40 45 0
2 2 30 35 1
3 3 70 65 0
4 4 70 15 0
5 5 40 15 1
6 6 80 45 1
7 7 20 15 0
8 8 20 15 0
9 9 50 35 0
10 10 70 25 NA
資料
df1 <- structure(list(ID = 1:10, Var1 = c(40L, 30L, 70L, 70L, 40L, 80L,
20L, 20L, 50L, 70L), Var2 = c(45L, 35L, 65L, 15L, 15L, 45L, 15L,
15L, 35L, 25L)), class = "data.frame", row.names = c(NA, -10L
))
df2 <- structure(list(ID = c(1L, 2L, 5L, 6L, 9L, 10L, 21L, 22L), Error = c(0L,
1L, 1L, 1L, 0L, NA, 0L, NA)), class = "data.frame", row.names = c(NA,
-8L))
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/338778.html
上一篇:在日期范圍內加入
