如果在任何列中找到值,则填充新列

时间:2017-09-27 19:59:17

标签: r matching

我想检查数据框中的每一行。我需要检查该行中的所有列以查看它是否包含1,如果是,我是否要填充另一列,如果任何列的值为1,则汇总。

到目前为止,我尝试使用grepl通过匹配' 1'返回逻辑索引,然后使用ifelse,将逻辑矢量更改为' yes'或者'没有'

dat1$imputed_data <- ifelse(grepl("1", imputed_columns), "yes", "no")

我也试过

for(i in nrow(imputed_columns)){
   if (any(imputed_columns[i,])==1)
   {
       dat1$imputed_data[i] <- "yes"
   }else{
       dat1$imputed_data[i] <- "no"
   }
}

我的两个尝试都没有用,我认为两者的问题可能就是我指定要检入的列的方式。

have:
A B C 
0 0 0
0 1 1
1 0 0
0 0 0

want:
A B C   imputed_data
0 0 0   no
0 1 1   yes
1 0 0   yes
0 0 0   no

请帮我弄清楚如何做这项工作。提前谢谢你。

3 个答案:

答案 0 :(得分:2)

使用:

dat$imputed <- c('no','yes')[1 + (rowSums(dat == 1) > 0)]

给出:

> dat
  A B C imputed
1 0 0 0      no
2 0 1 1     yes
3 1 0 0     yes
4 0 0 0      no

这是做什么的:

  • rowSums(dat == 1) > 0创建一个逻辑向量,指示行是否包含1
  • 1添加到其中会给出一个整数向量
  • 反过来可以用来创建yesno值的适当向量。

使用过的数据:

dat <- structure(list(A = c(0L, 0L, 1L, 0L), B = c(0L, 1L, 0L, 0L), C = c(0L, 1L, 0L, 0L)),
                 .Names = c("A", "B", "C"), class = "data.frame", row.names = c(NA, -4L))

答案 1 :(得分:1)

众多解决方案之一:

a1 = data.frame(A = c(0,0,1,0), B = c(0,1,0,0), C = c(0,1,0,0))

a1$imputed = apply(a1, 1, function(x) ifelse(any(x == 1), 'yes', 'no'))

  A B C imputed
1 0 0 0      no
2 0 1 1     yes
3 1 0 0     yes
4 0 0 0      no

答案 2 :(得分:0)

一种dplyr方式是

a1 %>% mutate(imputed_data = ifelse(rowSums(. == 1) != 0, "yes", "no"))