【问题标题】:R Automatically name results of LoopR自动命名循环的结果
【发布时间】:2020-02-05 02:24:33
【问题描述】:

我有一个数据框列表:

df_DJF = data.frame(replicate(2,sample(0:130,30,rep=TRUE)))
df_JJA = data.frame(replicate(2,sample(0:130,20,rep=TRUE)))
df_MAM = data.frame(replicate(2,sample(0:130,25,rep=TRUE)))
df_SON = data.frame(replicate(2,sample(0:130,15,rep=TRUE)))

df_list = list(df_DJF, df_JJA, df_MAM, df_SON)

我想随机选择每个数据帧的 80%。我可以通过执行此操作并使用 sample_size 作为行索引来手动执行此操作。

sample_size = floor(0.8*nrow(df_DJF))
picked_DJF = sample(seq_len(nrow(df_DJF)), size = sample_size)

我的问题是我有很多行数不同的 df。所以我想自动化这个过程。最后,我想要 4 个样本大小,其中包含正确的数字。 sample_sizes 的名称应该是:

samplenames = paste("sample_size", c("DJF", "JJA", "MAM", "SON"), sep = "_")

“picked”也一样...应该是pick_DJF等等...

【问题讨论】:

  • 查找 assign,这对于循环似乎可以正常工作,但对于 apply 函数效果较差
  • 我已经尝试过分配,但我最终只得到了一个样本...你能告诉我怎么做吗?
  • for(x in samplenames){assign(x,sample(0:130,30,rep=TRUE))}

标签: r loops sample


【解决方案1】:

继续使用列表,而不是 assign。设置您的names(df_list) = c("DJF", "JJA", "MAM", "SON"),然后为后续列表使用相同的名称,例如picked 列表。

# for a single sample size
picked = lapply(df_list, function(x) x[sample(1:nrow(x), size = floor(0.8 * nrow(x))), ])

使用lapply 将保留原始列表的名称,因此您不必担心。

对于来自每个数据框的多个样本大小,您可以创建一个嵌套列表,其中包含嵌套的lapply

names(df_list) = c("DJF", "JJA", "MAM", "SON")
sample_prop = list(s1 = 0.2, s2 = 0.4, s3 = 0.6, s4 = 0.8)
picked = lapply(df_list, function(df) lapply(sample_prop, function(sp) {
  df[sample(nrow(df), size = floor(sp * nrow(df))), ]
}))

# then access individual data frames with `$` or `[[`
picked$JJA$s3
#    X1  X2
# 17 70 128
# 7  94 121
# 1  57 125
# 8  32  75
# 9  15   8
# 19 58  15
# 20 55  17
# 10 42  15
# 4  51  67
# 12 89  13
# 2  74  50
# 14 77  36

要将数据框划分为“已选择”和“未选择”,split 是有意义的。它已经返回一个list。这将给出一个三重嵌套列表结果:

result = lapply(df_list, function(df) lapply(sample_prop, function(sp) {
  n_pick = floor(sp * nrow(df))
  n_unpick = nrow(df) - n_pick
  split(df, f = c(rep("picked", n_pick), rep("unpicked", n_unpick))[sample(nrow(df))])
}))

result$JJA$s3$unpicked
#     X1  X2
# 2   74  50
# 3   62  78
# 4   51  67
# 6  103  42
# 7   94 121
# 11  59  60
# 14  77  36
# 16  83  72

【讨论】:

  • 还有一个问题。如何获得“未选择”列表。我还想要一个数据框列表,其中包含没有被选中的行。我最初的想法是做 Cal = df_DJF[picked,] Val = df_DJF[-picked,]
  • 查看拆分数据的编辑,而不仅仅是子集。
猜你喜欢
  • 1970-01-01
  • 2021-05-04
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-07
  • 1970-01-01
相关资源
最近更新 更多