R:如何从每一列中随机抽取一个值 bootstrap

R: How to randomly sample one value from each column and bootstrap

我有 18 列和 100 行,其中列代表 18 个学生,行代表他们在 100 次考试中的成绩。这就是我想要的:对于每个学生,我想从所有 100 个年级中随机 sample/select 只有一个年级。换句话说,我想要一个 18 列只有 1 行的样本。我试过应用、示例函数,但所有这些都不起作用,我也不知道为什么。任何帮助将不胜感激!非常感谢!

bs = data.frame(matrix(nrow=1,ncol=18))
for (i in colnames(high)){
  bs[,i]=sample(high[,i],1,replace=TRUE)
}

as.data.frame(lapply(high[,i],sample,18,replace=TRUE))

假设您的数据是这样的:

set.seed(100)
high = matrix(runif(100*18),ncol=18)
colnames(high) = paste0("student",1:18)
rownames(high) = paste0("exam",1:100)

head(high)
        student1   student2  student3  student4  student5  student6   student7
exam1 0.30776611 0.32741508 0.3695961 0.8495923 0.5112374 0.2202326 0.03176634
exam2 0.25767250 0.38947869 0.9563228 0.6532260 0.2777107 0.7431595 0.57970549
exam3 0.55232243 0.04105275 0.9135767 0.9508858 0.3606569 0.3059573 0.15420484
exam4 0.05638315 0.36139663 0.8233363 0.6172230 0.4375279 0.4022088 0.12527050

你想要做的,是样本 1 到 100,18 次替换(类似于 bootstrap,感谢@H1 指出这一点):

set.seed(101)
take=sample(1:100,18,replace=TRUE)
take
 [1] 73 57 46 95 81 58 95 61 60 59 99  3 32  9 96 99 99 98

从上面可以看出,99 被 replace=TRUE 占用了很多次。我们将取 column1 的 73 个条目,column2 的 56 个条目等等。这可以通过以下方式完成:

high[cbind(take,1:18)]
 [1] 0.57256477 0.84338121 0.71225050 0.56432392 0.23865929 0.23563641
 [7] 0.51903694 0.36692427 0.51577410 0.45780908 0.19434773 0.70247028
[13] 0.60383059 0.25451088 0.78583242 0.86241707 0.05360842 0.61892604

试试这个

apply(data, 2, sample, size = 1)

使用@StupidWolf 的数据进行测试:

set.seed(101)
apply(high, 2, sample, size = 1)

#   student1   student2   student3   student4   student5   student6   student7   student8   student9  student10  student11  student12  student13  student14  student15  student16  student17  student18
# 0.57256477 0.84338121 0.71225050 0.56432392 0.23865929 0.23563641 0.51903694 0.36692427 0.51577410 0.45780908 0.19434773 0.70247028 0.60383059 0.25451088 0.78583242 0.86241707 0.05360842 0.61892604

您可以使用 sample() 来 运行domly select 一个列。

我在这里创建了一小部分数据样本。如果您提供示例数据以更好地理解问题,将会很有帮助。

# sample data
df <- data.frame(
  student1 = c(50, 45, 86, 30),
  student2 = c(56, 78, 63, 58),
  student3 = c(88, 60, 75, 93),
  student4 = c(87, 33, 49, 11),
  student5 = c(85, 96, 55, 64)
)

然后你遍历每条考试记录,运行domly 选择一个学生的成绩并将其存储在一个向量中。作为最后一步,由于您需要数据框,因此可以将矢量转换为数据框。

# column names
students <- colnames(df)

# empty vector
vals <- c()

for(s in students) {
  grade <- sample(df[[s]], 1)
  vals <- c(vals, grade)
}

finalDF <- as.data.frame(t(vals))
names(finalDF) <- students
finalDF

2 次迭代的输出 I 运行 是 -

  student1 student2 student3 student4 student5
1       45       78       93       87       64

  student1 student2 student3 student4 student5
1       45       63       93       87       96

其他答案真的很聪明,但尽管如此,我希望这对您有所帮助!

您可以重新排列数据框:

df <- df[sample(1:nrow(df)),]

然后您对数据框中的每个组进行第一个观察:

df.pick <- df[!duplicated(df$group) , ]