r - 按行添加值并将它们应用于单行变量,同时保留其他变量和行

标签 r dplyr

我有一个看起来像这样的数据框,

df <- data.frame(num1 = c('a','b','c','d')
                 ,num2 = c(1,2,3,4)
                 ,num3 = c(5,6,7,8)
                 ,num4 = c('x','y','b','d'))

并且希望输出来自

num1  num2  num3 num4
a     1     5    x
b     2     6    y
c     3     7    b
d     4     8    d

num1  num2  num3 num4
a     10    26   x 
b     2     6    y
c     3     7    b
d     4     8    d

这是在我自己的解决方案中实现结果的示例

df <- data.frame(num1 = c('a', 'b', 'c', 'd'),
                 num2 = c(1, 2, 3, 4),
                 num3 = c(5, 6, 7, 8),
                 num4 = c('x', 'y', 'b', 'd'))

sum_summarised <- df %>% 
  filter(grepl('a|b|c',num1)) %>% 
  summarise(num2 = sum(num2), num3 = sum(num3))

df <- df %>% 
  mutate(num2 = if_else(num1 == 'a',sum_summarised$num2,num2))

df <- df %>% 
  mutate(num3 = if_else(num1 == 'a',sum_summarised$num3,num3))

本质上是对 num2/num3 列求和,并将总和应用于变量行,同时保留变量 b、c 和 d 的原始行值以及 num 4 列值。

首选是使用 dplyr - 我尝试了 group_byslice 以及 filter 组合的变体,但无济于事。对于我遇到的这个独特问题,任何帮助将不胜感激。谢谢!

最佳答案

另一种方法是使用rows_update()。这有点冗长,但我想说,如果我们想要构建更复杂的操作,这是值得的。下面我们调用 rows_update() ,并在内部使用 summarise() 首先定义我们想要连接的 id 列,然后定义我们想要使用 `across() 更新的列,其他一切都将保持不变。

library(dplyr)

df %>% 
  rows_update(
    df %>%
      summarise(num1 = "a",
                across(num2:num3, sum)),
    by = "num1")

#>   num1 num2 num3 num4
#> 1    a   10   26    x
#> 2    b    2    6    y
#> 3    c    3    7    b
#> 4    d    4    8    d

我们还可以在 tibble 中执行更复杂的操作,例如,如果我们不想对 c 求和,我们可以 filter():

df %>% 
  rows_update(
    df %>%
      filter(num1 != "c") %>% 
      summarise(num1 = "a",
                across(num2:num3, sum)),
    by = "num1")

#>   num1 num2 num3 num4
#> 1    a    7   19    x
#> 2    b    2    6    y
#> 3    c    3    7    b
#> 4    d    4    8    d

来自OP的数据

df <- data.frame(num1 = c('a','b','c','d')
                 ,num2 = c(1,2,3,4)
                 ,num3 = c(5,6,7,8)
                 ,num4 = c('x','y','b','d'))

reprex package 于 2023 年 3 月 3 日创建(v2.0.1)

关于r - 按行添加值并将它们应用于单行变量,同时保留其他变量和行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75627371/

相关文章:

r - R Shiny:单个应用程序的用户身份验证

r - ggplot2 Boxplot 显示与计算不同的中位数

r - sparklyr中first,last,nth的使用

r - 错误 : cannot open the connection in R Shiny

r - R3.3.2 中的错误 : evaluation nested too deeply: infinite recursion/options(expressions=)?

regex - 如何在R中的list.files中执行复杂的正则表达式

r - dplyr 可以总结多个变量而不列出每个变量吗?

R - 为列值的随机样本选择行?

r - 如何计算不同变量的不同列数之间的最大差异

r - 如何使用 dplyr 确定在指定天数内发生的事件数?