【问题标题】:Loop, subset and putting it all together - R循环,子集并将它们放在一起 - R
【发布时间】:2016-09-11 15:23:48
【问题描述】:

我有一个数据框。我们就叫他dean_data

dean_data<-data.frame(date=c("23/06/2010", "23/06/2010", "23/06/2010", "29/07/2010", "29/07/2010", "29/07/2010"),
                  hb=c(60, 55, 50, 80, 60, 70),
                  pe=c(11.5, 11.2, 11.7, 8.5, 8, 8.25),
                  v.d=c(2.17, 2.65, 3.66, 2.78, 2.71, 2.68))

首先,我想计算参数“n”次的均值和标准差,按日期(因子)改变线条的位置。

只有在我做数据子集之前,我才能这样做,像这样:

jun13<-subset(dean_data, date=="23/06/2010")

B = 1000
df<-matrix(NA,nrow=B)  
for (b in (1:B)){
  df[b]<-mean(sample(jun13$hb, replace=F)/(sample(jun13$pe, replace=F)*sample(jun13$v.d, replace=F)))
}
df

但是我有几个日期(n = 30)......我想学习以自动方式执行此操作,将数据子集分组并应用参数计算的重复。结果,我希望得到一个按日期显示平均值和 SD 的表格。

【问题讨论】:

  • 我们的预期输出是什么?
  • 因此您想按日期对数据进行分组。然后对每个组执行 1000 次操作。结果将是一个 data.frame,其中包含与唯一日期一样多的数千行。我猜对了吗?
  • 是的!或按日期命名的列中并排的 1000 个结果,或按日期命名的平均值和 SD。随便。

标签: r for-loop dplyr


【解决方案1】:

所以这是一个尝试:

dat = data_frame(date=c("23/06/2010", "23/06/2010", "23/06/2010", 
                        "29/07/2010", "29/07/2010", "29/07/2010"), 
                 hb=c(60, 55, 50, 80, 60, 70), 
                 pe=c(11.5, 11.2, 11.7, 8.5, 8, 8.25), 
                 v.d=c(2.17, 2.65, 3.66, 2.78, 2.71, 2.68))

dl = split(dat, dat$date) # split the data into groups, based on date

# create a helper function for readability
find_mean = function(hb, pe, v.d) {
    sapply(1:1000, function(n) {
        x = sample(hb, replace=F)
        y = sample(pe, replace=F)
        z = sample(v.d, replace=F)
        mean(x / (y * z))
    })
}

# loop through each subset of the data and find the mean
# output is a list of 1000x1 vectors
m = lapply(dl, function(df) {
  find_mean(df$hb, df$pe, df$v.d)
})

# convert the list to a dataframe 
df = as.data.frame(m)
names(df) = names(dl)

head(df)

  23/06/2010 29/07/2010
1   1.760103   3.116560
2   1.770163   3.117997
3   1.767054   3.108493
4   1.784863   3.131723
5   1.799818   3.107862
6   1.770163   3.128762

【讨论】:

  • 结果很奇怪,函数在mean(x / y * z)中是错误的...正确的形式是mean(x / (y *z))。
  • 我更正了公式。你能解释一下结果很奇怪是什么意思吗?只是公式错了吗?
  • 是的,就是这个。结果不改?我希望值范围为 0-13 .. 所以。
  • 啊,好点子。更改公式后,我可能应该更新head(df) 结果。现在更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 2014-02-20
  • 2019-02-03
相关资源
最近更新 更多