【问题标题】:Follow up - Sampling random row from data frame跟进 - 从数据框中随机抽取行
【发布时间】:2021-01-24 02:46:06
【问题描述】:

我曾问过一个关于从提供了解决方案的列表中抽样的问题。这是后续

我的问题有两个步骤。我想从一个数据框中采样多行(3),然后再取第二个样本(1 行),它不在第一个样本中。
set.seed(42)
df <- data.frame(matrix(rnorm(20), nrow=10))
( samples <- sample(nrow(df), size = 4) )
# [1] 6 8 4 9
sample_1 <- df[ samples[-1], ]
sample_2 <- df[ samples[1],,drop = FALSE ]
sample_1
#            X1         X2
# 8 -0.09465904 -2.6564554
# 4  0.63286260 -0.2787888
# 9  2.01842371 -2.4404669
sample_2
#           X1        X2
# 6 -0.1061245 0.6359504
有没有办法在循环中构建它,这样当第一次迭代完成时,第二个样本不包含第一个样本的数据。

非常感谢。

【问题讨论】:

  • 为什么要循环执行此操作?你想构建多对这样的数据框吗?
  • 嗨罗纳克沙阿,是的,这就是目的

标签: r dataframe for-loop sample


【解决方案1】:

我们可以使用for 循环在每次迭代时更新数据集,同时返回

df1 <- df
sizevec <- c(3, 1)
lst1 <- vector('list', 2)
for(i in seq_along(lst1)) {
      samples <- sample(nrow(df1), size = sizevec[i]) 
      lst1[[i]] <- df1[samples,, drop = FALSE]
      df1 <- df1[-samples,, drop = FALSE]
  }

-输出

lst1
#[[1]]
#          X1         X2
#2 -0.5646982  2.2866454
#5  0.4042683 -0.1333213
#4  0.6328626 -0.2787888

#[[2]]
#         X1        X2
#3 0.3631284 -1.388861

【讨论】:

  • 谢谢阿克伦。这个解决方案很有用。我很感激!
【解决方案2】:

您可以通过对数据框的行进行采样并使用 3 + 1 行从中生成 matrix 来轻松做到这一点。如果 nrow(df) %% 4 == 0FALSE 因为回收,这可能会在最后产生重复。我们可以通过将duplicated 设置为NA 来消除它们。

set.seed(42)
m <- matrix(sample(1:nrow(df)), 4)
m[duplicated(as.vector(m))] <- NA
m
#      [,1] [,2] [,3]
# [1,]    1    2    7
# [2,]    5    4    3
# [3,]   10    6   NA
# [4,]    8    9   NA

现在我们将apply 普通子集设置为m 的列,将第一行值用于单个样本,其余用于四倍样本。当然,如果 nrow(df) 不能被四整除,m 中的 NAs 会导致四倍样本更小或为零。

res <- setNames(
  apply(m, 2, function(i) list(samp.1=df[na.omit(i[2:4]), ], samp.2=df[i[1], ])), 
  paste0("draw.", seq(ncol(m))))
res
# $draw.1
# $draw.1$samp.1
# X1         X2
# 5   0.40426832 -0.1333213
# 10 -0.06271410  1.3201133
# 8  -0.09465904 -2.6564554
# 
# $draw.1$samp.2
# X1      X2
# 1 1.370958 1.30487
# 
# 
# $draw.2
# $draw.2$samp.1
# X1         X2
# 4  0.6328626 -0.2787888
# 6 -0.1061245  0.6359504
# 9  2.0184237 -2.4404669
# 
# $draw.2$samp.2
# X1       X2
# 2 -0.5646982 2.286645
# 
# 
# $draw.3
# $draw.3$samp.1
# X1        X2
# 3 0.3631284 -1.388861
# 
# $draw.3$samp.2
# X1         X2
# 7 1.511522 -0.2842529

数据:

df <- structure(list(X1 = c(1.37095844714667, -0.564698171396089, 0.363128411337339, 
0.63286260496104, 0.404268323140999, -0.106124516091484, 1.51152199743894, 
-0.0946590384130976, 2.01842371387704, -0.062714099052421), X2 = c(1.30486965422349, 
2.28664539270111, -1.38886070111234, -0.278788766817371, -0.133321336393658, 
0.635950398070074, -0.284252921416072, -2.65645542090478, -2.44046692857552, 
1.32011334573019)), class = "data.frame", row.names = c(NA, -10L
))

【讨论】:

  • 谢谢 jay.sf。这给了我我需要的东西。欣赏!
  • 嗨@trix,很高兴听到这个消息。在这种情况下,您可以accept the answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多