【问题标题】:calculating sum and dealing with NAs计算总和并处理 NA
【发布时间】:2020-08-12 02:08:59
【问题描述】:

我遇到了 rowSum 函数的问题。发生的事情是任何带有 NA 的行都被计为 0,我不希望这样。这是我的数据:

V1 V2 V3   V4
1  0  0    1
0  1  NA   1
NA  NA NA  NA

这是正在发生的事情:

V1 V2 V3   V4  SUM
1  0  0    1    2
0  1  NA   1    2
NA  NA NA  NA   0

我想要这个:

V1 V2 V3   V4  SUM
1  0  0    1    2
0  1  NA   1    2
NA  NA NA  NA   NA 

我查看了几个网站,尝试了很多不同的代码迭代,但我一直得到相同的结果。这是我使用过的最基本的代码,虽然我尝试使用 dplyr。有人可以帮帮我吗?

df$sum <- rowSums(df, na.rm = T)

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以利用这一事实

    NA ^ 0
    #[1] 1
    NA ^ 1
    #[1] NA
    

    rowSums中使用它,我们可以做到:

    rowSums(df, na.rm = TRUE) * NA^(rowSums(!is.na(df)) == 0)
    #[1]  2  2 NA
    

    【讨论】:

    • 谢谢你,罗纳克!我不明白胡萝卜。另外,我认为它不太奏效。
    • 它适用于您提供的示例。你赋值了吗? df$sum &lt;- rowSums(df, na.rm = TRUE) * NA^(rowSums(!is.na(df)) == 0).
    • 我做到了。我可以做些什么来让您更好地了解我的数据吗?还有更多变量,我不确定这是否重要。在此先感谢,罗纳克。 :)
    • 你得到什么输出?或者您收到错误消息?在此示例中,我们对df 中的所有列求和,如果在您的真实数据中您只想对选定的列求和,则应相应地对数据进行子集化。例如,要从计算中删除第一列,请执行 rowSums(df[-1], na.rm = TRUE) * NA^(rowSums(!is.na(df[-1])) == 0) 或仅选择列 2:4 rowSums(df[2:4], na.rm = TRUE) * NA^(rowSums(!is.na(df[2:4])) == 0)。这有帮助吗?
    • 实际上,您的解决方案确实奏效了——谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多