我有一个看起来像这样的数据框,
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_by
和 slice
以及 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/