【发布时间】:2016-09-17 19:40:17
【问题描述】:
我有一个包含 6 列的数据框“my_data”:
group1.members group2.members group3.members price price.2 price.3
1 1 1 800 877 334
1 2 1 850 877 334
2 2 1 859 877 334
3 1 1 859 877 334
3 1 2 870 877 334
2 2 2 870 877 334
2 3 2 870 877 334
1 3 3 880 877 334
我想按 ROW 将 my_data 的“价格”列总结为几个单独的数据框,并在每个不同的“group.member”列上使用 group_by。不过,似乎 group_by 不允许这样做?
这就是我的想法:
my_data <- as.data.frame(data)
num_of_years <- c(1,2,3)
for(i in 1:length(num_of_years)){
price_means <- my_data %>% group_by(my_data[i]) %>%
select(-value) %>%
summarise_each(funs(mean(., na.rm=TRUE))) %>%
ungroup
assign(paste("PriceMeans",i,sep=""),price_means, envir = .GlobalEnv)
}
换句话说:
- 对于 i=1,使用 group_by(group1.members)
- 对于 i=2,使用 group_by(group2.members)
- 对于 i=3,使用 group_by(group3.members)
编辑:我的解决方案如下:
for(i in 1:length(my_groups)){
# construct the group to select
current.group <- my_groups[i]
current.group <- paste0("memb_", current.group)
# construct the groups to exclude
groups.to.drop <- my_groups[-i]
groups.to.drop <- paste0("memb_", groups.to.drop)
# Get Means
Means <- data %>% group_by_(as.name(current.group)) %>%
select(- c(ID, get(groups.to.drop))) %>%
summarise_each(funs(mean(., na.rm = TRUE)))
Means <- Means[,-1:-(length(my_groups)-1)]
Means <- as.list(Means)
assign(x = paste0("Means_",i),
value = Means,
envir = parent.env(new.env())
}
【问题讨论】:
-
你需要使用lazyeval方法来编写你的函数。
-
谢谢!我查看了lazyeval 的文档,但不明白如何实现这一点。你能提供一个简短的例子吗?
-
这个特定的链接解释了lazyeval是如何由dplyr库处理的link
-
@Arun,好像我们都有 exact 相同的句柄。这可能会令人困惑。你会考虑改变你的吗?我之所以问,是因为我在 R 标记下的这个句柄下活动的时间更长(= 许多人已经把这个句柄与我联系起来了)。