这不是一个很好的题目.我想对每个组的数据框中的某些列求和,不包括我的每个组的一列.一个简单的例子如下:

df <- tibble(group_name = c("A", "B","C"), mean_A = c(1,2,3), mean_B = c(2,3,4), mean_C=c(3,4,5))
df %>% group_by(group_name) %>% mutate(m1 = sum(across(contains("mean"))))

这将创建m1列,它是每组平均值a、平均值b和平均值c的总和.我想做的是排除a组的平均值a、b组的平均值b和c组的平均值c.不过,下面的方法不起作用(这并不奇怪).

df %>% group_by(group_name) %>% mutate(m1 = sum(across(c(contains("mean") & !contains(group_name)))))

你知道我该怎么做吗?我的原始数据包含更多的组,因此很难手动完成.

编辑:我try 了下面的方法,它以一种基本的方式解决了这个问题,但是有些东西(?grepl)在这里似乎不太管用,我得到了错误的结果.

df %>% pivot_longer(!group_name) %>% mutate(value2 = case_when(grepl(group_name, name) ~ 0, TRUE ~ value)) %>% group_by(group_name) %>% summarise(m1 = sum(value2))

Edit2:找出上面和下面的错误,但仍然有很多警告,所以我建议大家关注下面TarJae的回应

df %>% pivot_longer(!group_name) %>% group_by(group_name) %>% mutate(value2 = case_when(grepl(group_name, name) ~ 0, TRUE ~ value)) %>% group_by(group_name) %>% summarise(m1 = sum(value2))

推荐答案

下面是另一个选项,您可以直接在tidyselect助手中使用group_name:

df %>% 
  rowwise() %>% 
  mutate(m1 = rowSums(select(across(starts_with("mean")), -ends_with(group_name)))) %>% 
  ungroup()

Output

  group_name mean_A mean_B mean_C    m1
  <chr>       <dbl>  <dbl>  <dbl> <dbl>
1 A               1      2      3     5
2 B               2      3      4     6
3 C               3      4      5     7

How it works

  1. 行输出across是一个1行TIBLE,只包含以"mean"开头的变量.
  2. select通过across从输出中取消 Select 变量子集,该变量以group_name中的值结束.
  3. 此时,剩下的是一个1 x 2的TIBLE,然后用rowSums求和.

R相关问答推荐

无法运行通过R中的Auto.arima获得的ARIMA模型

工作流程_set带有Dplyrr风格的 Select 器,用于 Select 结果和预测因子R

ggplot的轴标签保存在officer中时被剪切

R Sapply函数产生的值似乎与for循环方法略有不同

使用ggsankey调整Sankey图中单个 node 上的标签

如何优化向量的以下条件赋值?

删除具有相同标题的tabPanel(shinly)

如何使用ggplot对堆叠条形图进行嵌套排序?

在rpart. plot或fancyRpartPlot中使用带有下标的希腊字母作为标签?

如何同时从多个列表中获取名字?

将一个字符串向量调整为与其他字符串向量完全相同的大小

用两种 colored颜色 填充方框图

如何创建累加到现有列累计和的新列?

将具有坐标列表列的三角形转换为多个多边形

如何在条形图中的x和填充变量中包含多个响应变量?

如何在GALT包的函数&geom_x样条线中调整线宽

R将函数参数传递给ggploy

R:使用ApexCharge更改标签在饼图中的位置

分隔日期格式为2020年7月1日

如何将数据框压缩为更宽,同时将行输入保持为行输入,而不是R中的列名?