как создать фреймы данных (а не только один) сразу в r - PullRequest
0 голосов
/ 05 декабря 2018

Это еще один вопрос из неупорядоченной комбинации и сохранения результата в матрице в 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"]])
}

Но это не работает.Я видел одно возможное решение с использованием assign из Использование цикла для создания нескольких фреймов данных в R , но предлагается не использовать.Большое спасибо за совет!

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Вы можете использовать split, чтобы разделить 1 фрейм данных в список из нескольких фреймов данных, используя нужный вам коэффициент.Например, следующее разделит df на 5 фреймов данных на основе столбца id

df <- data.frame(id = 1:5, Val = rnorm(5))
split(df, df$id)

. Это также будет работать, если вы хотите использовать rownames элемента data.frame вместо иid столбец:

split(df, rownames(df))
0 голосов
/ 05 декабря 2018

Вместо этого вы можете сохранить его в списке фреймов данных

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
#....
#....

Таким образом, теперь вы можете получить доступ к отдельным фреймам данныхпо имени list_df[["day_1_1"]], list_df[["day_1_2"]] и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...