当我在 R 中使用聚合时,我可以将总和应用于每一行吗?
Posted
技术标签:
【中文标题】当我在 R 中使用聚合时,我可以将总和应用于每一行吗?【英文标题】:Can I apply the sum to every row when I use aggregate in R [closed] 【发布时间】:2018-12-23 13:06:50 【问题描述】:当我使用聚合(或任何其他更好的函数)时,如何将总和应用于每一行?非常感谢您的帮助!XD
原始数据
Categories vaule
A1 5
A2 3
C 2
B1 6
A3 1
B2 5
目标
Categories Groups SUM of the Group
A1 A 9
A2 A 9
C C 2
B1 B 11
A3 A 9
B2 B 11
【问题讨论】:
欢迎来到 ***。请花一些时间重新组织您的问题,您可以参考“What topics can I ask about here?”和how to ask good questions。 试试library(dplyr); df1 %>% group_by(Groups = str_remove(Categories, "\\d+")) %>% mutate(SUMOFGROUP = sum(value))
请不要使用图片作为数据。以可以复制和粘贴到 R 的形式提供数据。您可以使用dput(x)
以可复制的形式提供x
。
【参考方案1】:
我们可以使用tidyverse
。通过删除“类别”中的一位或多位数字(stringr
中的str_remove
)然后 mutate
以在按“组”分组后获得“值”的sum
来创建“组”
library(tidyverse)
df1 %>%
group_by(Groups = str_remove(Categories, "\\d+")) %>%
mutate(SUMOFGROUP = sum(value)) %>%
select(-value)
# A tibble: 6 x 3
# Groups: Groups [3]
# Categories Groups SUMOFGROUP
# <chr> <chr> <int>
#1 A1 A 9
#2 A2 A 9
#3 C C 2
#4 B1 B 11
#5 A3 A 9
#6 B2 B 11
数据
df1 <- structure(list(Categories = c("A1", "A2", "C", "B1", "A3", "B2"
), value = c(5L, 3L, 2L, 6L, 1L, 5L)), .Names = c("Categories",
"value"), class = "data.frame", row.names = c(NA, -6L))
【讨论】:
【参考方案2】:使用最后注释中定义的DF
这是一个基本解决方案:
Group <- gsub("\\d", "", DF$Category)
transform(DF, Value = NULL, Group = Group, Sum = ave(Value, Group, FUN = sum))
给予:
Category Group Sum
1 A1 A 9
2 A2 A 9
3 C C 2
4 B1 B 11
5 A3 A 9
6 B2 B 11
注意
可重现形式的输入DF
是:
Lines <-
"Category Value
A1 5
A2 3
C 2
B1 6
A3 1
B2 5"
DF <- read.table(text = Lines, header = TRUE, as.is = TRUE)
【讨论】:
我不得不使用read.table(textConnection(Lines), …)
,而不是read.table(text = Lines, …)
。
这应该没有必要。再试一次。
我肯定不会再试一次,因为你应该知道,重复同样的事情并期待不同的结果是精神错乱的表现。
将 R 升级到最新版本并在全新的原版会话中试用。有问题,因为 text= 确实可以作为 read.table
的参数。
正如您似乎通过建议“升级 R”所怀疑的那样,行为可能会因 R 的不同版本而有所不同,这并没有错。既然我可以很容易地让它工作,我就不用费心“升级”了。以上是关于当我在 R 中使用聚合时,我可以将总和应用于每一行吗?的主要内容,如果未能解决你的问题,请参考以下文章