我有一个 Dataframe 看起来像,
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))
实际上,对num 2/num 3列求和,并将总和应用于行a变量,同时保留变量b、c和d的原始行值以及num 4列值。
首选将使用dplyr -我已经尝试了group_by
和slice
和filter
组合的变种无济于事。任何帮助将非常感谢在这个独特的问题,我所面临的。谢谢!
3条答案
按热度按时间axr492tv1#
另一种方法是使用
rows_update()
。这有点冗长,但我想说如果我们想构造更复杂的操作,它是值得的。下面我们调用rows_update()
,在里面我们使用summarise()
,首先定义我们想要连接的id列,然后定义我们想要用'across()更新的列,其他的一切都不会改变。我们还可以在
tibble
中执行更复杂的运算,例如,如果我们不想对c
求和,我们可以filter()
:数据来自OP
由reprex package(v2.0.1)于2023年3月3日创建
wbgh16ku2#
由于您对
dplyr
有偏好,我们可以使用across
和if_else
:输出:
输出:
tjvv9vkg3#
一种方法是使用“dplyr”包中的
transmute()
: