我有一个如下所示的数据框:
id <- c(1,1,1,2,2,2,3,3,3,4,4,4)
value <- c(2,3,3,4,2,2,4,4,3,2,2,3)
df <- data.frame(id, value)
我现在想要做的是编译第一个ID(1和2)的两个数据帧并在其上编译计算。我想继续接下来的两个数据帧(id为3和4)并对它进行计算等等......这对所有行来说都是如此。所以psuedo代码看起来像:
#loop over dataframe
for i in 1:nrow(df) {
#fetch the rows of the first two ids
#perform calculcation on ti
#move on to the next two columns
#perform calculation on it.
}
关于如何在R中编写最有效的代码的任何线索?
答案 0 :(得分:2)
我建议制作一个明确的id_pair
变量,根据您的描述对id
的值进行分组。然后,您可以在新的id_pair
变量上执行分组计算。以下是使用dplyr
:
library(dplyr)
df %>%
mutate(id_pair = ceiling(id / 2)) %>%
group_by(id_pair) %>%
summarise(
ids = paste(unique(id), collapse = ", ")
mean_value = mean(value)
)
Source: local data frame [2 x 3]
id_pair mean_value ids
(dbl) (dbl) (chr)
1 1 2.666667 1, 2
2 2 3.000000 3, 4
您也可以在不将id_pair
存储为中间值的情况下获得结果:
df %>%
group_by( ceiling(id / 2)) %>%
summarise(mean_value = mean(value))
Source: local data frame [2 x 2]
ceiling(id/2) mean_value
(dbl) (dbl)
1 1 2.666667
2 2 3.000000
答案 1 :(得分:0)
我认为有多种方法可以做到这一点,但这是我提出的方法。首先,创建一个您想要进行子集化的ID列表,然后在subset
函数中的aggregate
函数中使用这些列表条目。
id <- c(1,1,1,2,2,2,3,3,3,4,4,4)
value <- c(2,3,3,4,2,2,4,4,3,2,2,3)
df <- data.frame(id, value)
df_list = list(c(1,2), c(3,4))
#not grouped by id
for(i in 1:2){
sum_df = aggregate(value~1, FUN = function(x) c('sd' = sd(x),
'mean' = mean(x)),
data = subset(df, id %in% df_list[[i]]))
assign(paste0('df',paste0(df_list[[i]], collapse = '')),
sum_df)
}
> df12
value.sd value.mean
1 0.8164966 2.6666667
> df34
value.sd value.mean
1 0.8944272 3.0000000
#grouped by id
for(i in 1:2){
sum_df = aggregate(value~id, FUN = function(x) c('sd' = sd(x),
'mean' = mean(x)),
data = subset(df, id %in% df_list[[i]]))
assign(paste0('dfg',paste0(df_list[[i]], collapse = '')),
sum_df)
}
> dfg12
id value.sd value.mean
1 1 0.5773503 2.6666667
2 2 1.1547005 2.6666667
> dfg34
id value.sd value.mean
1 3 0.5773503 3.6666667
2 4 0.5773503 2.3333333
答案 2 :(得分:0)
基础R解决方案。这些组使用分箱方法构建。奇数因子水平将设置为NA。
gr <- .bincode(df$id,seq(0,max(df$id),2))
aggregate(df$value,list(gr),mean)