根据一个变量对数据帧进行分组
Grouping the dataframe based on one variable
我有一个包含 10 个变量的数据框,所有变量都是数字,其中一个变量名称是年龄,我想根据 age.example 对观察结果进行分组。 17 到 18 岁一组,19-22 岁另一组,然后每一行都应该附加到每一组。结果应该是用于进一步操作的数据框。
数据框模型:
A B AGE
25 50 17
30 42 22
50 60 19
65 105 17
355 400 21
68 47 20
115 98 18
25 75 19
我想要这样的结果
17-18
A B AGE
25 50 17
65 105 17
115 98 18
19-22
A B AGE
30 42 22
50 60 19
355 400 21
68 47 20
115 98 18
25 75 19
我确实使用拆分函数根据 Age var 对数据集进行了分组,现在我关心的是如何操作分组数据。 Eg:the 答案看起来像
A B AGE
25 50 17
65 105 17
115 98 18
A B AGE
30 42 22
50 60 19
355 400 21
68 47 20
115 98 18
25 75 19
我的问题是如何访问每个组以进行进一步操作?
例如:如果我想分别对每个组进行 t 检验?
split 函数适用于数据帧。使用 cut
和 'breaks' 或 findInterval
和一组适当的切点(如果您使用命名参数,则命名为 'vec')作为分组的标准,split
。 cut
的默认间隔在右侧闭合,findInterval
的默认间隔在左侧闭合。
> split(dat, findInterval(dat$AGE, c(17, 19.5, 22.5)))
$`1`
A B AGE
1 25 50 17
3 50 60 19
4 65 105 17
7 115 98 18
8 25 75 19
$`2`
A B AGE
2 30 42 22
5 355 400 21
6 68 47 20
这是 cut
的方法
lst <- split(df1, cut(df1$AGE, breaks=c(16, 18, 22), labels=FALSE))
lst
# $`1`
# A B AGE
#1 25 50 17
#4 65 105 17
#7 115 98 18
#$`2`
# A B AGE
#2 30 42 22
#3 50 60 19
#5 355 400 21
#6 68 47 20
#8 25 75 19
更新
如果您需要为每个 "list" 元素查找 sum
、mean
列
lapply(lst, function(x) rbind(colSums(x[-3]),colMeans(x[-3])))
但是,如果 objective 是根据组查找汇总统计信息,则可以使用任何聚合函数来完成
library(dplyr)
df1 %>%
group_by(grp=cut(AGE, breaks=c(16, 18, 22), labels=FALSE)) %>%
summarise_each(funs(sum=sum(., na.rm=TRUE),
mean=mean(., na.rm=TRUE)), A:B)
# grp A_sum B_sum A_mean B_mean
#1 1 205 253 68.33333 84.33333
#2 2 528 624 105.60000 124.80000
或使用 base R
中的 aggregate
do.call(data.frame,
aggregate(cbind(A,B)~cbind(grp=cut(AGE, breaks=c(16, 18, 22),
labels=FALSE)), df1, function(x) c(sum=sum(x), mean=mean(x))))
数据
df1 <- structure(list(A = c(25L, 30L, 50L, 65L, 355L, 68L, 115L, 25L
), B = c(50L, 42L, 60L, 105L, 400L, 47L, 98L, 75L), AGE = c(17L,
22L, 19L, 17L, 21L, 20L, 18L, 19L)), .Names = c("A", "B", "AGE"
), class = "data.frame", row.names = c(NA, -8L))
我有一个包含 10 个变量的数据框,所有变量都是数字,其中一个变量名称是年龄,我想根据 age.example 对观察结果进行分组。 17 到 18 岁一组,19-22 岁另一组,然后每一行都应该附加到每一组。结果应该是用于进一步操作的数据框。 数据框模型:
A B AGE
25 50 17
30 42 22
50 60 19
65 105 17
355 400 21
68 47 20
115 98 18
25 75 19
我想要这样的结果
17-18
A B AGE
25 50 17
65 105 17
115 98 18
19-22
A B AGE
30 42 22
50 60 19
355 400 21
68 47 20
115 98 18
25 75 19
我确实使用拆分函数根据 Age var 对数据集进行了分组,现在我关心的是如何操作分组数据。 Eg:the 答案看起来像
A B AGE
25 50 17
65 105 17
115 98 18
A B AGE
30 42 22
50 60 19
355 400 21
68 47 20
115 98 18
25 75 19
我的问题是如何访问每个组以进行进一步操作? 例如:如果我想分别对每个组进行 t 检验?
split 函数适用于数据帧。使用 cut
和 'breaks' 或 findInterval
和一组适当的切点(如果您使用命名参数,则命名为 'vec')作为分组的标准,split
。 cut
的默认间隔在右侧闭合,findInterval
的默认间隔在左侧闭合。
> split(dat, findInterval(dat$AGE, c(17, 19.5, 22.5)))
$`1`
A B AGE
1 25 50 17
3 50 60 19
4 65 105 17
7 115 98 18
8 25 75 19
$`2`
A B AGE
2 30 42 22
5 355 400 21
6 68 47 20
这是 cut
lst <- split(df1, cut(df1$AGE, breaks=c(16, 18, 22), labels=FALSE))
lst
# $`1`
# A B AGE
#1 25 50 17
#4 65 105 17
#7 115 98 18
#$`2`
# A B AGE
#2 30 42 22
#3 50 60 19
#5 355 400 21
#6 68 47 20
#8 25 75 19
更新
如果您需要为每个 "list" 元素查找 sum
、mean
列
lapply(lst, function(x) rbind(colSums(x[-3]),colMeans(x[-3])))
但是,如果 objective 是根据组查找汇总统计信息,则可以使用任何聚合函数来完成
library(dplyr)
df1 %>%
group_by(grp=cut(AGE, breaks=c(16, 18, 22), labels=FALSE)) %>%
summarise_each(funs(sum=sum(., na.rm=TRUE),
mean=mean(., na.rm=TRUE)), A:B)
# grp A_sum B_sum A_mean B_mean
#1 1 205 253 68.33333 84.33333
#2 2 528 624 105.60000 124.80000
或使用 base R
aggregate
do.call(data.frame,
aggregate(cbind(A,B)~cbind(grp=cut(AGE, breaks=c(16, 18, 22),
labels=FALSE)), df1, function(x) c(sum=sum(x), mean=mean(x))))
数据
df1 <- structure(list(A = c(25L, 30L, 50L, 65L, 355L, 68L, 115L, 25L
), B = c(50L, 42L, 60L, 105L, 400L, 47L, 98L, 75L), AGE = c(17L,
22L, 19L, 17L, 21L, 20L, 18L, 19L)), .Names = c("A", "B", "AGE"
), class = "data.frame", row.names = c(NA, -8L))