2017-01-23 3 views
0

У меня есть два data.frames firstdf и secondf, (примерные данные ниже.) Я пытаюсь создать функцию, которая выводит результаты, такие как данные ExampleList, которые у меня ниже. Я хочу создать список списков, где он захватывает первые записи строки из firstdf и помещает их значения в предметные и тестовые поля в exampleList, затем захватывает первые 3 значения из другого поля во втором файле, объединяет их вместе и сохраняет их в другом поле в exampleList, а затем переходит к следующей строке в firstdf и следующих трех строках во втором файле. Петли для меня немного сложны, поэтому советы определенно оценены.Функция для создания списка списка из двух data.frames

data: 

dput(firstdf) 
structure(list(thing = structure(1:3, .Label = c("thing1", "thing2", 
"thing3"), class = "factor"), test = structure(1:3, .Label = c("test1", 
"test2", "test3"), class = "factor")), .Names = c("thing", "test" 
), row.names = c(NA, -3L), class = "data.frame") 

dput(seconddf) 
    structure(list(otherthing = structure(c(4L, 5L, 6L, 7L, 8L, 9L, 
    1L, 2L, 3L), .Label = c("thing10", "thing11", "thing12", "thing4", 
    "thing5", "thing6", "thing7", "thing8", "thing9"), class = "factor"), 
     other = structure(c(9L, 6L, 7L, 2L, 3L, 1L, 8L, 4L, 5L), .Label = c("fads", 
     "oiu", "qwer", "rewa", "rewq", "sfas", "sfwg", "tre", "xdfs" 
     ), class = "factor")), .Names = c("otherthing", "other"), row.names = c(NA, 
    -9L), class = "data.frame") 

И выход:

dput(ExampleList) 
list(structure(list(thing = "thing1", test = "test1", otherthing = c("thing4", 
"thing5", "thing6")), .Names = c("thing", "test", "otherthing" 
)), structure(list(thing = "thing2", test = "test2", otherthing = c("thing7", 
"thing8", "thing9")), .Names = c("thing", "test", "otherthing" 
)), structure(list(thing = "thing3", test = "test3", otherthing = c("thing10", 
"thing11", "thing12")), .Names = c("thing", "test", "otherthing" 
))) 
[[1]] 
[[1]]$thing 
[1] "thing1" 

[[1]]$test 
[1] "test1" 

[[1]]$otherthing 
[1] "thing4" "thing5" "thing6" 


[[2]] 
[[2]]$thing 
[1] "thing2" 

[[2]]$test 
[1] "test2" 

[[2]]$otherthing 
[1] "thing7" "thing8" "thing9" 


[[3]] 
[[3]]$thing 
[1] "thing3" 

[[3]]$test 
[1] "test3" 

[[3]]$otherthing 
[1] "thing10" "thing11" "thing12" 
+0

Возможный дубликат http://stackoverflow.com/questions/26177565/converting-nested-list-to-dataframe – akrun

+0

@akrun Я готов забить это как дубликат, но нам нужна лучшая цель для этого imho – Jaap

+0

Я сказал как можно, и не утвердительно – akrun

ответ

0

Вы можете использовать Map, многомерный вариант lapplysplit для otherthing). Первым параметром является функция применяется к нескольким параметрам, которые будут последовательно параллельно, так

ExampleList <- Map(list, 
    thing = as.character(firstdf$thing), 
    test = as.character(firstdf$test), 
    otherthing = split(as.character(seconddf[[1]]), rep(1:3, each = 3))) 

str(ExampleList) 

## List of 3 
## $ thing1:List of 3 
## ..$ thing  : chr "thing1" 
## ..$ test  : chr "test1" 
## ..$ otherthing: chr [1:3] "thing4" "thing5" "thing6" 
## $ thing2:List of 3 
## ..$ thing  : chr "thing2" 
## ..$ test  : chr "test2" 
## ..$ otherthing: chr [1:3] "thing7" "thing8" "thing9" 
## $ thing3:List of 3 
## ..$ thing  : chr "thing3" 
## ..$ test  : chr "test3" 
## ..$ otherthing: chr [1:3] "thing10" "thing11" "thing12" 
+0

Спасибо, ваше предложение очень хорошо работает с моими данными примера. Однако мои реальные данные secondddf намного длиннее, и я получаю следующую ошибку, когда я пробую ваше предложение. Есть ли способ изменить ваш код, чтобы иметь дело с более длинным seconddf? Ошибка: предупреждающее сообщение: В файле split.default (as.character (seconddf [[1]]) rep (length (firstdf $ thing)): длина данных не кратная переменной split – user3476463

+0

Проверьте '? Split' Из примера я предположил, что вы хотели, чтобы он разделился на три, но если это отличается для ваших реальных данных, вам нужно построить вектор для разбиения на ту же длину, что и вектор для разделения, с уникальным значением для каждого раскола Мне бы хотелось закончить. – alistaire

Смежные вопросы