我如何在r中实现这个countif?

时间:2017-07-31 18:55:37

标签: r dataframe

我的两个数据帧:

 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

谢谢!

3 个答案:

答案 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的方法,但使用dplyrtidyr

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