2

我有一个数据框,它具有以下结构,包含两列data1data2. 以下是样本数据:

data1       data2        
800000    1
800030    0.956521739130435
1000000   0.480916030534351
1686626   0.496
1687492   0.174757281553398
2148463   0.0344827586206897
2850823   0.05
2959087   0.0416666666666667

我想计算第二行的平均值,即data2每 1000000 个计数data1。这意味着它应该给出前 2 行的平均值,然后是接下来的 3 行,然后是接下来的 3 行,依此类推......

输出应该是一个数据帧,其最后一个值在 1000000 区间内,平均值为 1000000 区间内的平均值data2: 示例输出如下所示:

 800030  0.97826087
 1687492 0.38389110
 2959087 0.04204981

可以帮助在 R 中做到这一点吗?

4

4 回答 4

5

假设您的数据在 data.frame 中DF,您可以使用aggregate函数来执行此操作

> with(DF, aggregate(data2, by=list((data1+0.01)%/%1000000), mean ))
  Group.1          x
1       0 0.97826087
2       1 0.38389110
3       2 0.04204981

要获取mean计算过的列中的值,您将不得不aggregate再次使用 - 这次是在data1列本身上。之后,您可以merge生成两个结果数据帧。

res <- with(DF, merge(aggregate(data1, by = list((data1 + 0.01)%/%1e+06), paste), aggregate(data2, by = list((data1 + 0.01)%/%1e+06), mean), by = "Group.1"))
names(res) <- c("Group", "Values", "Mean")
res
##   Group                    Values       Mean
## 1     0            800000, 800030 0.97826087
## 2     1 1000000, 1686626, 1687492 0.38389110
## 3     2 2148463, 2850823, 2959087 0.04204981
于 2013-04-09T09:09:13.793 回答
3

你可以这样做:

group <- cut(df$data1, c(0,1000000,2000000,3000000))
tapply(df$data2, group, mean)
# (0,1e+06] (1e+06,2e+06] (2e+06,3e+06] 
# 0.81247926    0.33537864    0.04204981 

编辑:要自动计算breaksin seq,您可以替换c(0,1000000,2000000,3000000)为:

c(seq(0, max(df$data1), by=1000000),max(df$data1))

编辑 2:以下使用ddplyfromplyr将在数据框中返回均值和最大值:

group <- cut(df$data1, c(seq(0, max(df$data1), by=1000000),max(df$data1)))
ddply(df, .(group), summarize, mean=mean(data2), max=max(data2))
#              group       mean   max
# 1        (0,1e+06] 0.81247926 1.000
# 2    (1e+06,2e+06] 0.33537864 0.496
# 3 (2e+06,2.96e+06] 0.04204981 0.050
于 2013-04-09T08:53:20.983 回答
2

为了多样性,这里有另一个解决方案,使用split

sapply(split(df,df$data1%/%1e6), function(x)mean(x$data2))
         0          1          2 
0.97826087 0.38389110 0.04204981 

编辑:甚至更简单:

sapply(split(df$data2,df$data1%/%1e6), mean)
于 2013-04-09T09:50:00.230 回答
0

为了完整起见,我想在 tidyverse宇宙中提出一个解决方案

library(tidyverse)

df <- tribble(
~data1,   ~data2,        
800000,    1,
800030,    0.956521739130435,
1000000,   0.480916030534351,
1686626,   0.496,
1687492,   0.174757281553398,
2148463,   0.0344827586206897,
2850823,   0.05,
2959087,   0.0416666666666667)

df |> 
  mutate(group= data1 %/% 1000000) |> 
  group_by(group) |> 
  summarize(max_in_group = max(data1), mean_data2 = mean(data2), n_in_group = n())
#> # A tibble: 3 x 4
#>   group max_in_group mean_data2 n_in_group
#>   <dbl>        <dbl>      <dbl>      <int>
#> 1     0       800030     0.978           2
#> 2     1      1687492     0.384           3
#> 3     2      2959087     0.0420          3

尽管似乎并非所有小数都被打印出来,但它只是dplyr. 所有小数的计算如下所示

df |> 
  mutate(group= data1 %/% 1000000) |> 
  group_by(group) |> 
  summarize(max_in_group = max(data1), mean_data2 = mean(data2), n_in_group = n()) |> 
  pull(mean_data2)
#> [1] 0.97826087 0.38389110 0.04204981

reprex 包于 2022-03-05 创建(v2.0.1)

于 2022-03-05T21:24:34.990 回答