我的两个数据帧:
df1
Col1
A
B
C
df2
Col1
A
D
E
F
我想将第二列Col2添加到df1,其中如果Col1中的相应值也在df2的Col1中,则列中的每个值都是1。因此df1看起来像这样:
df1
Col1 Col2
A 1
B 0
C 0
谢谢!
答案 0 :(得分:2)
将col2添加到df2
df2$Col2 <- 1
执行左连接合并:
df3 <- merge(df1, df2, all.x=T, by='Col1')
用零替换NA
df3$Col2[which(is.na(df3$Col2))] <- 0
df3现在是
Col1 Col2
1 A 1
2 B 0
3 C 0
使用as.numeric
和%in%
编辑:@ycw has done it more concisely。我喜欢他的答案,但我想我编辑我的作品,包括他的作品中没有使用dplyr的作品:
它就像df1$Col2 <- as.numeric(df1$Col1 %in% df2$Col1)
一样简单。比我的好多了!
答案 1 :(得分:1)
df3
是最终输出。
library(dplyr)
df1 <- data_frame(Col1 = c("A", "B", "C"))
df2 <- data_frame(Col1 = c("A", "D", "E", "F"))
df3 <- df1 %>% mutate(Col2 = as.numeric(Col1 %in% df2$Col1))
或者以下方法类似于HarlandMason的方法,但使用dplyr
和tidyr
。
library(dplyr)
library(tidyr)
df3 <- df2 %>%
mutate(Col2 = 1) %>%
right_join(df1, by = "Col1") %>%
replace_na(list(Col2 = 0))
答案 2 :(得分:1)
使用data.table
首先使用%chin%
运算符:
library(data.table)
x = data.table(v = LETTERS[1:3])
y = data.table(v = c("A","D","E","F"))
x[, found:= v %chin% y$v]
x
#> v found
#> 1: A TRUE
#> 2: B FALSE
#> 3: C FALSE
第二个是基于合并行为:
library(data.table)
x = data.table(v = LETTERS[1:3])
y = data.table(v = c("A","D","E","F"))
y[, found := TRUE]
x[, found:= y[.SD, .(ifelse(is.na(found), FALSE, TRUE)), on = .(v)]]
x
#> v found
#> 1: A TRUE
#> 2: B FALSE
#> 3: C FALSE
编辑:根据@frank评论,您可以简化为ifelse
- 它是相同的
x[, found:= y[.SD, !is.na(found), on = .(v)]]
x
#> v found
#> 1: A TRUE
#> 2: B FALSE
#> 3: C FALSE
为了理解会发生什么,这是我构建的内部代码:
x[, found := NULL]
y[x, on = .(v)]
#> v found
#> 1: A TRUE
#> 2: B NA
#> 3: C NA