循环R来自单个数据集的多个样本

时间:2012-10-16 07:17:36

标签: r loops for-loop stata

我正在尝试在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中是否也是必要的?

2 个答案:

答案 0 :(得分:4)

您有以下问题:

  1. 未声明尝试,因此无法分配attempt[i]。要么使其成为填充循环内的矩阵(如果要保留样本),要么将其用作临时变量attempt
  2. 文件名采用文学名称,您需要使用paste()sprintf()在文件名中包含变量i的值。
  3. 以下是代码的工作版本:

    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

答案 1 :(得分: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")))