【问题标题】:loop R multiple samples from single dataset从单个数据集中循环 R 多个样本
【发布时间】:2012-10-16 07:17:35
【问题描述】:

我正在尝试在 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 中这也有必要吗?

【问题讨论】:

  • 为什么要投票关闭? IMO 这是一个非常适合这个网站的 Q。

标签: r loops for-loop stata


【解决方案1】:

您有以下问题:

  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 中的此类操作保留和恢复数据。

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

    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")))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多