从单个数据集中循环取多个样本

5
我将尝试在R中创建一个简单的循环,其中我有一个大型数据集,希望从该数据集中创建多个较小的样本并将它们导出到Excel:
我认为它应该像这样工作,但它没有:
 idorg <- c(1,2,3,4,5)
 x <- c(14,20,21,16,17)
 y <- c(31,21,20,50,13)
 dataset <- cbind (idorg,x,y)


 for (i in 1:4)
 {
 attempt[i] <- dataset[sample(1:nrow(dataset), 3, replace=FALSE),]
 write.table(attempt[i], "C:/Users/me/Desktop/WWD/Excel/dataset[i].xls", sep='\t')
 }

在Stata中,如果要进行循环操作,需要保存和恢复数据,但在R中是否也需要这样做呢?

为什么要投票关闭这个问题?在我看来,这是一个非常适合这个网站的问题。 - Roman Luštrik
2个回答

5
你有以下问题:
  1. attempt[i] 未声明,因此无法对其进行赋值。如果要保留样本,请将其作为矩阵在循环内填充;否则请使用它作为临时变量 attempt
  2. 文件名以字面意义被接受,你需要使用 paste()sprintf() 将变量 i 的值包含在文件名中。
以下是代码的工作版本:
idorg <- c(1,2,3,4,5)
x <- c(14,20,21,16,17)
y <- c(31,21,20,50,13)
dataset <- cbind (idorg,x,y)

for (i in 1:4)  {
  attempt <- dataset[sample(1:nrow(dataset), 3, replace=FALSE),]
  write.table(attempt, sprintf( "C:/Users/me/Desktop/WWD/Excel/dataset[%d].xls", i ), sep='\t')
}

Excel能够读取这种以制表符分隔的表格吗?我不确定;我会制作一个逗号分隔的表格,并将其保存为.csv文件。


2
与Stata不同,您在R中不需要为这种操作保留和恢复数据。
我认为1月份的解决方案可以解决您的问题,但我想分享另一种选择:使用lapply()获取数据集所有样本的列表:
set.seed(1) # So you can reproduce these results
temp <- setNames(lapply(1:4,
                        function(x) { 
                          x <- dataset[sample(1:nrow(dataset),
                                              3, replace = FALSE), ]; x }),
                 paste0("attempt.", 1:4))

这创建了一个名为"temp"的list(),其中包含了四个data.frame
temp
# $attempt.1
#      idorg  x  y
# [1,]     2 20 21
# [2,]     5 17 13
# [3,]     4 16 50
# 
# $attempt.2
#      idorg  x  y
# [1,]     5 17 13
# [2,]     1 14 31
# [3,]     3 21 20
# 
# $attempt.3
#      idorg  x  y
# [1,]     5 17 13
# [2,]     3 21 20
# [3,]     2 20 21
# 
# $attempt.4
#      idorg  x  y
# [1,]     1 14 31
# [2,]     5 17 13 
# [3,]     4 16 50

在 R 中,列表非常方便。您现在可以使用 lapply() 做其他有趣的事情,例如如果您想要找出行总和,可以执行 lapply(temp, rowSums)。或者,如果您想要输出单独的 CSV 文件(可由 Excel 读取),可以执行以下操作:

lapply(names(temp), function(x) write.csv(temp[[x]],
                             file = paste0(x, ".csv")))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接