总结一个值是否包含在多个其他列中

时间:2016-03-09 09:31:56

标签: r dplyr

我正在调查一个包含100多列的大型数据集。一组列包含整数,其中整数不会跨列重复。例如,数字6可能会或可能不会出现在一行中,但它只会在列中出现一次。

示例模型(请记住,围绕这些列有数百个其他非相关列):

> x1 <- c(1,6,4,5)
> x2 <- c(6,0,11,3)
> x3 <- c(5,0,9,6)
> df <- data.frame(cbind(x1, x2, x3))
> df
  x1 x2 x3
1  1  6  5
2  6  0  0
3  4 11  9
4  5  3  6

理想情况下使用dplyr(因为我试图变得更多&#34;流畅&#34;),我如何最干净地创建一个新列来指示其他列中是否包含6?考虑到数据集中100个其他列的reshape2融化,我犹豫是否犹豫不决。

我目前的,凌乱的解决方案:

> library(dplyr)
> df <- mutate(df, Contains6 = (x1 == 6) + (x2 == 6) + (x3 == 6),
+              Contains6 = revalue(as.factor(as.character(Contains6)), 
+                                  c("0"="No","1"="Yes")))
> df
  x1 x2 x3 Contains6
1  1  6  5       Yes
2  6  0  0       Yes
3  4 11  9        No
4  5  3  6       Yes

可能的扩展:是否有一种干净的,编程方式为x1:x3中包含的所有值创建类似的列,例如包含1,包含4等?

1 个答案:

答案 0 :(得分:0)

我们可以将applyMARGIN=1

一起使用
df$Contains6 <- c("no", "yes")[(apply(df==6, 1, any))+1L]
df$Contains6
#[1] "yes" "yes" "no"  "yes"

如果我们需要创建多个“包含”列,我们可以使用lapply

循环
v1 <- c(1,4,6)
df[paste0("Contains", v1)] <- lapply(v1, function(i) 
           c('no', 'yes')[(apply(df==i, 1, any))+1L])