我正在尝试在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中是否也是必要的?
答案 0 :(得分:4)
您有以下问题:
attempt[i]
。要么使其成为填充循环内的矩阵(如果要保留样本),要么将其用作临时变量attempt
。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
。
答案 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")))