我在数据框中有9880条记录,我试图将其分成9组,每组1000条,最后一组将有880条记录,并相应地命名。我为1-9组使用for循环,但是手动为最后880个记录,但我相信有更好的方法来实现这一点,
library(sqldf)
for (i in 0:8)
{
assign(paste("test",i,sep="_"),as.data.frame(final_9880[((1000*i)+1):(1000*(i+1)), (1:53)]))
}
test_9<- num_final_9880[9001:9880,1:53]
也无法将所有部分附加到一个for循环中!
#append all parts
all_9880<-rbind(test_0,test_1,test_2,test_3,test_4,test_5,test_6,test_7,test_8,test_9)
感谢任何帮助,谢谢!
答案 0 :(得分:2)
不需要循环 - 使用split
data <- data.frame(a = 1:9880, b = sample(letters, 9880, replace = TRUE))
splitter <- (data$a-1) %/% 1000
.list <- split(data, splitter)
lapply(0:9, function(i){
assign(paste('test',i,sep='_'), .list[[(i+1)]], envir = .GlobalEnv)
return(invisible())
})
all_9880<-rbind(test_0,test_1,test_2,test_3,test_4,test_5,test_6,test_7,test_8,test_9)
identical(all_9880,data)
## [1] TRUE
答案 1 :(得分:2)
this解决方案的一个小变化
ls <- split(final_9880, rep(0:9, each = 1000, length.out = 9880)) # edited to Roman's suggestion
for(i in 1:10) assign(paste("test",i,sep="_"), ls[[i]])
您的绑定命令应该有效。
修改强>
如果您有许多数据帧,则可以使用parse-eval组合。我使用包gsubfn
来提高可读性。
library(gsubfn)
nms <- paste("test", 1:10, sep="_", collapse=",")
eval(fn$parse(text='do.call(rbind, list($nms))'))
这是如何工作的?首先,我创建一个包含数据帧的逗号分隔列表的字符串
> paste("test", 1:10, sep="_", collapse=",")
[1] "test_1,test_2,test_3,test_4,test_5,test_6,test_7,test_8,test_9,test_10"
然后我用这个字符串构建列表
list(test_1,test_2,test_3,test_4,test_5,test_6,test_7,test_8,test_9,test_10)
使用parse
和eval
进行字符串插值。
eval(fn$parse(text='list($nms)'))
字符串插值是通过fn$
的{{1}}前缀实现的,其效果是拦截parse
并使用变量$nms
中包含的字符串替换nms
。解析和评估字符串"list($mns)"
会创建所需的列表。在解决方案中,rbind
包含在parse-eval组合中。
编辑2
您可以使用特定模式收集所有变量,将它们放入列表中并按行绑定它们。
do.call("rbind", sapply(ls(pattern = "test_"), get, simplify = FALSE))
ls
查找所有带有“test _”
sapply
检索所有这些变量并将它们存储在列表中
do.call
逐行展平列表。