我正在调查一个包含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等?
答案 0 :(得分:0)
我们可以将apply
与MARGIN=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])