这只是突然出现在我的脑海,
让我们以最近的一个问题为例:
数据:
df1<-
structure(list(Year = c(2015L, 2015L, 2015L, 2015L, 2016L, 2016L,
2016L, 2016L), Category = c("a", "1", "2", "3", "1", "2", "3",
"1"), Value = c(2L, 3L, 2L, 1L, 7L, 2L, 1L, 1L)), row.names = c(NA,
-8L), class = "data.frame")
代码:
aggregate( Value ~ Year + c(MY_NAME = c("OneTwo", "three")[Category %in% 1:2 + 1]), data=df1, FUN=sum )
当前输出:(看一下新var的丑陋名称)
# Year c(MY_NAME = c("OneTwo", "three")[Category %in% 1:2 + 1]) Value
#1 2015 OneTwo 3
#2 2016 OneTwo 1
#3 2015 three 5
#4 2016 three 10
所需的输出:
# Year MY_NAME Value
#1 2015 OneTwo 3
#2 2016 OneTwo 1
#3 2015 three 5
#4 2016 three 10
请注意:
code:
部分的单行代码中直接添加代码来直接设置新变量的名称。 答案 0 :(得分:5)
我们需要c
而不是cbind
,这将导致matrix
的一列的列名为“ MY_NAME”,而c
得到的是named
vector
具有“ MY_NAME”的唯一名称(make.unique
)
aggregate( Value ~ Year +
cbind(MY_NAME = c("OneTwo", "three")[Category %in% 1:2 + 1]), data=df1, FUN=sum )
# Year MY_NAME Value
#1 2015 OneTwo 3
#2 2016 OneTwo 1
#3 2015 three 5
#4 2016 three 10
在?aggregate
中,提到了cbind
方法中formula
的用法
公式-公式,例如y〜x或cbind(y1,y2)〜x1 + x2,其中 y变量是数字数据,将根据 分组x变量(通常是因子)。
带有tidyverse
的选项为
library(dplyr)
df1 %>%
group_by(Year, MY_NAME = c("OneTwo", "three")[Category %in% 1:2 + 1]) %>%
summarise(Value = sum(Value))
答案 1 :(得分:4)
1)Aggregate.data.frame 使用Aggregate.data.frame而不是Aggregate.formula:
by <- with(df1,
list(
Year = Year,
MY_NAME = c("OneTwo", "three")[Category %in% 1:2 + 1]
)
)
aggregate(df1["Value"], by, FUN = sum)
给予:
Year MY_NAME Value
1 2015 OneTwo 3
2 2016 OneTwo 1
3 2015 three 5
4 2016 three 10
2)2个步骤将它分为两个部分(1)创建一个新的数据帧(其中转换了Category的数据)和(2)执行汇总,可能会更干净一些。
df2 <- transform(df1, MY_NAME = c("OneTwo", "three")[Category %in% 1:2 + 1])
aggregate(Value ~ Year + MY_NAME, df2, sum)
2a)或用magrittr管道表示(2):
library(magrittr)
df1 %>%
transform(MY_NAME = c("OneTwo", "three")[Category %in% 1:2 + 1]) %>%
aggregate(Value ~ Year + MY_NAME, ., sum)