【问题标题】:adding multiple columns include na in dataframe in r在 r 的数据框中添加多列包括 na
【发布时间】:2020-06-15 05:51:33
【问题描述】:

我有这样的数据框:

如果一行中有任何数值,我想通过忽略NA 创建一个新列,该列是其他列的总和。但如果一行中的所有值(如第二行)均为 na,则 sum 列将获得 NA

【问题讨论】:

  • df$col <- rowSums(df, na.rm = TRUE)

标签: r dataframe sum transform


【解决方案1】:

由于这是您在 SO 上的第一个活动,您应该查看this,它描述了如何制作最小且可重复的示例。如果您有更多问题,将来肯定需要这样做。通常不接受图像作为起点。

幸运的是,您的桌子很小。我把它变成了一个 tribble,然后用rowSums 计算出你想要的数字。

df <- tibble::tribble(
  ~x, ~y, ~z,
  6000, NA, NA,
  NA, NA, NA,
  100, 7000, 1000,
  0, 0, NA
)

df$sum <- rowSums(df, na.rm = T)
df
#> # A tibble: 4 x 4
#>       x     y     z   sum
#>   <dbl> <dbl> <dbl> <dbl>
#> 1  6000    NA    NA  6000
#> 2    NA    NA    NA     0
#> 3   100  7000  1000  8100
#> 4     0     0    NA     0

reprex package (v0.3.0) 于 2020 年 6 月 15 日创建

【讨论】:

    【解决方案2】:

    假设您的数据框称为 df

    cbind(df, apply(df, 1, function(x){if (all(is.na(x))) {NA} else {sum(x, na.rm = T)}))
    

    请注意,如果您的数据框有其他列,您需要将 apply 中的 df 调用限制为仅是您之后的列。

    【讨论】:

      【解决方案3】:

      您可以计算df 中的NA 值。如果连续没有非NA 值,您可以将输出分配为NA 或计算逐行总和,否则使用rowSums

      ifelse(rowSums(!is.na(df)) == 0, NA, rowSums(df, na.rm = TRUE))
      #[1]  6000    NA 10000  8100     0
      

      数据

      df <- structure(list(x = c(6000, NA, 10000, 100, 0), y = c(NA, NA, 
      NA, 7000, 0), z = c(NA, NA, NA, 1000, NA)), class = "data.frame", 
      row.names = c(NA, -5L))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-12
        • 2022-01-24
        • 2014-11-04
        • 1970-01-01
        相关资源
        最近更新 更多