如果其他值中存在值,则为列分配值

时间:2017-08-24 21:37:31

标签: r

第一个问题

给出以下数据框:

col_1 <- c(1, NA, 2, 3)
col_2 <- c(2, 1, 1, 2)
col_3 <- c(3, 2, 3, NA)
df <- data.frame(value_1, value_2, value_3)

col_1    col_2   col_3
    1       2       3
   NA       1       2
    2       1       3
    3       2      NA 

我想做这样的事情:如果df [1,1],df [1,2]和df [1,3]中存在数据,则将该行标记为1.否则将其标记为0因此,你可以得到这样的东西:

col_1 col_2 col_3 col_4
    1     2     3     1
   NA     1     2     0 
    2     1     3     1
    3     2    NA     0

第二个问题

或许,也许我有这个df:

col_1 <- c(1, NA, 2, 3)
col_2 <- c(NA, 1, 1, NA)
col_3 <- c(3, 2, 3, NA)
df <- data.frame(col_1, col_2, col_3)

col_1    col_2   col_3
    1       NA      3
   NA       1       2
    2       1       3
    3       NA     NA

我想创建一个变量,如果col_1和col_3中存在值,我将赋值为1.否则我指定0.所以它看起来像这样:

col_1    col_2   col_3   col_4
    1       NA       3       1
   NA      1        2       0
   NA      1        3       0
    3       NA      NA       0

我将如何完成此任务?

1 个答案:

答案 0 :(得分:1)

我们可以对数据列的子集或整个数据集

使用rowSums
df$col_4 <- as.integer(rowSums(!is.na(df[c(1, 3)]))==2)

另一个选项是Reduce整个数据集

df$col_4 <- as.integer(!Reduce(`|`, lapply(df, is.na)))

或列的子集

df$col_4 <- as.integer(!Reduce(`|`, lapply(df[c(1, 3)], is.na)))
df$col_4
#[1] 1 0 0 0