我有一个大型数据框finaldata
,我希望生成一堆其他较小的数据框explanatory1, explanatory2 e.t.c....
,每个数据框由finaldata
我尝试使用for循环执行此操作,但它给我一个错误attempt to apply non function
for(i in 1:length(finaldata)/10) {
nam <- paste("explanatory", i, sep = "")
assign(nam, finaldata[,10(i):10(i)+10])
}
我也试过
for(i in 1:length(finaldata)/10){
assign(paste("explanatory",i,sep=""),finaldata[,10(i):10(i)+10])}
但这给了我同样的错误,据我所知,错误是由于我将finaldata[,10(i):10(i)+10]
作为分配的论据而引起的,但我不明白为什么它不会起作用ina for循环,或者与传递finaldata[,10:10+10]
非常感谢任何帮助!
答案 0 :(得分:4)
使用split
:
ll <- lapply(split(colnames(finaldata),rep(seq_len(ncol(finaldata)/10),each=10)),
function(x)finaldata[,x])
这将创建一个列表。但你可以从中提取单独的变量(不推荐):
ll <- setNames(ll,paste0("explanatory",seq_along(ll)))
list2env(ll)
答案 1 :(得分:2)
创建要播放的样本数据:
df <- data.frame(matrix(vector(), 10, 33))
查找您要创建的数据框的数量:
number_of_dataframes <- ceiling(ncol(df) / 10)
循环遍历数据框,查找用于创建单个数据框的一系列列。使用assign
为每个人提供一个唯一的名称:
current_column <- 1
for (i in 1:number_of_dataframes) {
start_column <- current_column
end_column <- min(current_column + 9, ncol(df))
assign(paste0("df",i), df[ , start_column:end_column])
current_column <- end_column + 1
}
min
检查确保您不会尝试分配比原始数据框中更多的列。
答案 2 :(得分:1)
你差不多......试试这个......
for(i in 1:ncol(finaldata)/10) {
nam <- paste0("explanatory")
if((10*(i - 1)+10) > ncol(finaldata)){
assign(nam, finaldata[,(10*(i-1) +1):ncol(finaldata)])
}else{
assign(nam, finaldata[,(10*(i-1) +1):(10*(i - 1)+10)])
}
}
答案 3 :(得分:1)
这完全符合它,感谢@canary_in_the_data_mine。选择&#34; number_of_dataframes
&#34;成为&#34; finaldata
&#34;的一些因素你想要的目的是:
number_of_dataframes <- ceiling(ncol(finaldata) / 5)
current_column <- 1
for (i in 1:number_of_dataframes) {
start_column <- current_column
end_column <- current_column + 5
assign(paste0(explanatory,i), finaldata[,start_column:end_column])
current_column <- end_column + 1
}
我做的唯一改变是end_column。