如何在r中一次创建数据帧(不只是一个)

问题描述 投票:2回答:2

这是来自unordered combination and store the result in a matrix in r的另一个问题。

现在我有一个数据框如下

>head(plan)
  bal midway coro cab ljc ot
1   1      1    1   2   2  2
2   1      1    2   1   1  2
3   1      1    2   1   2  2
4   1      1    2   2   1  2
5   1      1    2   2   2  1
6   1      2    1   1   2  2

我想提取每行中等于1的元素,使用它的列名并置换它们,以存储在新的数据框中,比如第一行的day_1_1

> permutations(3, 3, v = names(plan)[which(plan[1,] == 1, arr.ind=T)[, "col"]])
     [,1]     [,2]     [,3]    
[1,] "bal"    "coro"   "midway"
[2,] "bal"    "midway" "coro"  
[3,] "coro"   "bal"    "midway"
[4,] "coro"   "midway" "bal"   
[5,] "midway" "bal"    "coro"  
[6,] "midway" "coro"   "bal"  

我的问题是我不知道如何在循环中创建名为day_1_i的新数据框(i匹配plan中的行号)。我试过了

for (i in 1:nrow(plan)) {
  paste0("day_1_", i) <- permutations(3, 3, v = names(plan)[which(plan[i,] == 1, arr.ind=T)[, "col"]])
}

但它不起作用。我已经看过使用assignUsing a loop to create multiple data frames in R的一种可能的解决方案,但建议不要使用。非常感谢您的建议!

r
2个回答
1
投票

您可以将其存储在数据框列表中

library(gtools)

list_df <- list()
for (i in 1:nrow(plan)) {
   list_df[[i]] <- data.frame(permutations(3, 3, 
           v = names(plan)[which(plan[i,] == 1, arr.ind=T)[, "col"]]))
}

如果需要,可以根据自己的选择重命名

list_df <- setNames(list_df, paste0("day_1_", 1:nrow(plan)))

list_df
#$day_1_1
#      X1     X2     X3
#1    bal   coro midway
#2    bal midway   coro
#3   coro    bal midway
#4   coro midway    bal
#5 midway    bal   coro
#6 midway   coro    bal

#$day_1_2
#   X1  X2  X3
#1 bal cab ljc
#2 bal ljc cab
#3 cab bal ljc
#4 cab ljc bal
#5 ljc bal cab
#6 ljc cab bal
#....
#....

因此,您现在可以通过名称qazxsw poi,qazxsw poi等访问各个数据框。


0
投票

您可以使用list_df[["day_1_1"]]使用您喜欢的因子将1个数据帧拆分为多个数据帧的列表。例如,以下将基于list_df[["day_1_2"]]列将split拆分为5个数据帧

df

如果你想使用data.frame的id而不是和df <- data.frame(id = 1:5, Val = rnorm(5)) split(df, df$id) 列,这也会有效:

rownames
© www.soinside.com 2019 - 2024. All rights reserved.