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 中是否也有必要?

4

2 回答 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.

于 2012-10-16T07:23:22.030 回答
2

与 Stata 不同,您无需为 R 中的此类操作保留和恢复数据。

我认为一月份的解决方案可以解决您的问题,但我想分享另一种选择:使用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))

这创建了一个list()包含四个data.frames 的命名“temp”。

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")))
于 2012-10-16T09:48:17.203 回答