循环“ ifelse”,包括NA

时间:2018-11-15 21:07:46

标签: r

我想使用ifelse()并在R中包含NA来运行循环。这是我的名为DATA的数据集的示例:

[,1]   [,2]    [,3]    [,4]
ID1     NA      NA      NA
ID2     0       0       0
ID3     1       1       1
ID4     0       0       1
ID5     1       1       0
ID6     0       NA      1
ID7     NA      0       0
ID8     NA      1       1

基本上,我想使用以下条件在末尾添加新列:

  • 如果第2、3或4列中至少有一个“ 1” => 1
  • 如果第2、3或4列中没有“ 1”,但至少有一个“ 0” => 0
  • 如果第2、3或4列中只有“ NA” =>没什么

我曾想使用类似的方法,但这是行不通的。它返回:

"NA" if there is no "1", but at least one "0", instead of
"NOTHING"

第6行的示例:

*ifelse(any((DATA[6,c(2:4)])==1), "1", ifelse(any((DATA[6,c(2:4)])==0), "0",
"NOTHING"))*

我真的不想返回“什么都没有” 。实际上,我要“不适用” ,但要 验证“ NA”是否是某些无效的结果,我使用了 “没有”。我也想遍历数据集中的每一行,但是我也不是很擅长。

1 个答案:

答案 0 :(得分:1)

rowSums.na <-
    function(x, na.rm = T){

        suma <- rowSums(x, na.rm = na.rm)
        ind  <- apply(x, 1, function(el){ all(is.na(el)) })

        suma[ind] <- NA

        return(suma)
}

df1$newCol<- +(rowSums.na(df1[,2:4]) > 0)

#> df1$newCol
#[1] NA  0  1  1  1  1  0  1

  • df1是您的数据。
  • 当所有值均为rowSums时,
  • normal sum / NA返回0。海事组织这是一个很大的错误。评估:

    1. rowSums(matrix(NA, 3, 3), na.rm = T)
    2. rowSums.na(matrix(NA, 3, 3))
  • +( ... )会将布尔值转换为数字类型。在R控制台中运行+( c(TRUE, FALSE, TRUE) )