将数据框中的一组因素与 dplyr 结合起来
combine sets of factors in a dataframe with dplyr
一个关于结合因素与dplry的问题。在下面的同一个 df 中,我想每年将因子 a 和 c 组合成一个新的因子 q,并将它们的值相加。我知道我可以 group_by(years),但我如何也 group_by q=a&c, l, b 和 y? (实际上,我想按年合并 12 个因素中的三个因素水平。)
year factor value
1977 a 564907
1977 c 349651
1977 l 2852949
1978 a 504028
1978 1 413120
1978 y 2553088
1979 a 497766
1979 c 789007
1979 b 1567934
1980 a 346892
我要:
year factor value
1977 q 564907 + 349651
1977 l 2852949
1978 q 504028
1978 1 413120
1978 y 2553088
1979 q 497766 + 789007
1979 b 1567934
1980 q 346892
提前致谢。
这是一个解决方案。不优雅,但我猜它很好用。
library(dplyr)
df %>%
mutate(index = ifelse(factor %in% c("a", "c"), "q", as.character(levels((factor))))) %>%
group_by(year, index) %>%
summarise(sum(value))
Source: local data frame [8 x 3]
Groups: year [?]
year index sum(value)
(int) (chr) (int)
1 1977 b 2852949
2 1977 q 914558
3 1978 l 413120
4 1978 q 504028
5 1978 y 2553088
6 1979 b 1567934
7 1979 q 1286773
8 1980 q 346892
这可以通过 car
中的 recode
来完成。 group by操作可以用data.table
来完成。我们将'data.frame'转换为'data.table'(setDT(df1)
),recode
将'factor'变量转换为levels
'a'和'c' 到 'q',将其与 'year' 一起用作分组变量,并得到 'value'.
的 sum
library(car)
library(data.table)
setDT(df1)[, list(value=sum(value)) ,
.(factor=recode(factor, "c('a', 'c')='q'"), year)]
# factor year value
#1: q 1977 914558
#2: l 1977 2852949
#3: q 1978 504028
#4: 1 1978 413120
#5: y 1978 2553088
#6: q 1979 1286773
#7: b 1979 1567934
#8: q 1980 346892
一个关于结合因素与dplry的问题。在下面的同一个 df 中,我想每年将因子 a 和 c 组合成一个新的因子 q,并将它们的值相加。我知道我可以 group_by(years),但我如何也 group_by q=a&c, l, b 和 y? (实际上,我想按年合并 12 个因素中的三个因素水平。)
year factor value
1977 a 564907
1977 c 349651
1977 l 2852949
1978 a 504028
1978 1 413120
1978 y 2553088
1979 a 497766
1979 c 789007
1979 b 1567934
1980 a 346892
我要:
year factor value
1977 q 564907 + 349651
1977 l 2852949
1978 q 504028
1978 1 413120
1978 y 2553088
1979 q 497766 + 789007
1979 b 1567934
1980 q 346892
提前致谢。
这是一个解决方案。不优雅,但我猜它很好用。
library(dplyr)
df %>%
mutate(index = ifelse(factor %in% c("a", "c"), "q", as.character(levels((factor))))) %>%
group_by(year, index) %>%
summarise(sum(value))
Source: local data frame [8 x 3]
Groups: year [?]
year index sum(value)
(int) (chr) (int)
1 1977 b 2852949
2 1977 q 914558
3 1978 l 413120
4 1978 q 504028
5 1978 y 2553088
6 1979 b 1567934
7 1979 q 1286773
8 1980 q 346892
这可以通过 car
中的 recode
来完成。 group by操作可以用data.table
来完成。我们将'data.frame'转换为'data.table'(setDT(df1)
),recode
将'factor'变量转换为levels
'a'和'c' 到 'q',将其与 'year' 一起用作分组变量,并得到 'value'.
sum
library(car)
library(data.table)
setDT(df1)[, list(value=sum(value)) ,
.(factor=recode(factor, "c('a', 'c')='q'"), year)]
# factor year value
#1: q 1977 914558
#2: l 1977 2852949
#3: q 1978 504028
#4: 1 1978 413120
#5: y 1978 2553088
#6: q 1979 1286773
#7: b 1979 1567934
#8: q 1980 346892