【问题标题】:Tidyverse Rowwise sum of columns that may or may not existTidyverse Rowwise 可能存在或不存在的列的总和
【发布时间】:2020-12-11 15:34:46
【问题描述】:

考虑以下小标题:

library(tidyverse)
data <- tibble(x = c(rnorm(5,2,n = 10)*1000,NA,1000),
               y = c(rnorm(1,1,n = 10)*1000,NA,NA))

假设我想对“x”和“y”进行逐行求和,创建变量“z”,如下所示:

data %>%
  rowwise() %>%
  mutate(z = sum(c(x,y), na.rm = T))

这对我想要的效果很好,但问题是我的真实数据集有很多变量,而我没有 想在我有什么变量之前检查我没有什么。所以,假设我可能有总和元素中不存在的变量:

data %>%
  rowwise() %>%
  mutate(k = sum(c(x,y,w), na.rm = T))

在这种情况下,它不会运行,因为列“w”不存在。 我怎样才能让它运行,忽略“w”的不存在并对“x”和“y”求和?

PS:我更喜欢在运行总和之前不过滤数据集。无论变量是否存在,我都想以某种方式使总和发生。

【问题讨论】:

  • 您可以使用across() from dplyr 并设置开始和结束变量!
  • 在我的情况下,我有一个特定的列表,比如 130 列,我想对总共 300 列求和...但这不是问题,我已经将指定的列表存储在向量。问题是这个列表有我的数据集中不存在的列,我想忽略而不是“清理列表”。
  • 也许res &lt;- df %&gt;% rowwise() %&gt;% mutate(Sum=sum(c_across(yourlistofvariables),na.rm=T))

标签: r sum tidyverse rowwise


【解决方案1】:

如果我正确理解了您的问题,这将是一个解决方案(对@Duck 的评论稍作修改:

library(tidyverse)

data <- tibble(x = c(rnorm(5,2,n = 10)*1000,NA,1000),
               y = c(rnorm(1,1,n = 10)*1000,NA,NA),
               a = c(rnorm(1,1,n = 10)*1000,NA,NA))


wishlist <- c("x","y","w")


data %>% 
  dplyr::rowwise() %>% 
  dplyr::mutate(Sum=sum(c_across(colnames(data)[colnames(data) %in% wishlist]),na.rm=T))

       x      y       a   Sum
   <dbl>  <dbl>   <dbl> <dbl>
 1 3496.   439.   -47.7 3935.
 2 6046.   460.  2419.  6506.
 3 6364.   672.  1030.  7036.
 4 1068.  1282.  2811.  2350.
 5 2455.   990.   689.  3445.
 6 6477.  -612. -1509.  5865.
 7 7623.  1554.  2828.  9177.
 8 5120.   482.  -765.  5602.
 9 1547.  1328.   817.  2875.
10 5602. -1019.   695.  4582.
11   NA     NA     NA      0 
12 1000     NA     NA   1000 

【讨论】:

  • 嗨@DPH 这解决了这个问题,但唯一的问题是,在你的例子中,愿望清单的变量名称是字符串,但我使用的是不带引号的符号 c(x,y)分数。这是因为我的输入(愿望清单)是一大块文本,例如“x,y,z”,我只是将其插入公式中。有没有办法在愿望清单的所有元素中保留此符号或同时应用引号?
  • 你可以用你的输入字符串试试这个:whishlist
  • 我在这里想通了。非常感谢!
【解决方案2】:

试试这个:

library(tidyverse)
data <- tibble(x = c(rnorm(5,2,n = 10)*1000,NA,1000),
               y = c(rnorm(1,1,n = 10)*1000,NA,NA))

data$k <- rowSums(as.data.frame(data[,which(c("x","y","w")%in%names(data))]),na.rm=TRUE)

输出:

# A tibble: 12 x 3
       x     y     k
   <dbl> <dbl> <dbl>
 1 3121.  934. 4055.
 2 6523. 1477. 8000.
 3 5538.  863. 6401.
 4 3099. 1344. 4443.
 5 4241.  284. 4525.
 6 3251. -448. 2803.
 7 4786. -291. 4495.
 8 4378.  910. 5288.
 9 5342.  653. 5996.
10 4772. 1818. 6590.
11   NA    NA     0 
12 1000    NA  1000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2020-03-15
    • 2011-10-03
    • 2012-11-10
    • 2013-12-26
    • 2010-09-25
    • 1970-01-01
    相关资源
    最近更新 更多