我想检查数据框中的每一行。我需要检查该行中的所有列以查看它是否包含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
请帮我弄清楚如何做这项工作。提前谢谢你。
答案 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
添加到其中会给出一个整数向量yes
和no
值的适当向量。使用过的数据:
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"))