循环数据框中的数据子集

时间:2016-02-15 14:27:22

标签: r

我有一个如下所示的数据框:

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中编写最有效的代码的任何线索?

3 个答案:

答案 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)