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) , ]
我有 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) , ]