складывать фреймы данных друг на друга и возвращать один фрейм данных - PullRequest
1 голос
/ 23 июня 2019

Я пытаюсь написать функцию (stackDataInList), чтобы объединить фрейм данных вместе, но при этом возникают проблемы, некоторая помощь очень ценится

>datList
[[1]]
ID value
1 a 0.9101742
2 b 0.3841854
3 c 1.6821761
[[2]]
ID value
1 d -0.6357365
2 e -0.4616447
[[3]]
ID value
1 f 1.4322822
2 g -0.6506964
3 h -0.2073807
4 i -0.3928079
[[4]]
ID value
1 j -0.3199929
2 k -0.2791133
3 l 0.4941883

dataList выглядит так

Так что в основном мне нужно создать функцию, и когда я ее вызову, я получу результаты ниже:

>stackDataInList(datList[1])
ID value
1 a 0.9101742
2 b 0.3841854
3 c 1.6821761
OR:
>stackDataInList(datList[c(1,3,4)])
ID value
1 a 0.9101742
2 b 0.3841854
3 c 1.6821761
4 f 1.4322822
5 g -0.6506964
6 h -0.2073807
7 i -0.3928079
8 j -0.3199929
9 k -0.2791133
10 l 0.4941883

Ответы [ 2 ]

2 голосов
/ 23 июня 2019

Есть несколько способов сделать это. Самый быстрый способ (особенно для больших фреймов данных) - использовать функцию rbindlist() для пакета data.table:

library(data.table)
datList <- list( data.frame(ID=c("a","b","c"), value=c(0.9101742,0.3841854, 1.6821761)),
             data.frame(ID=c("d","e"), value=c(-0.6357365,-0.4616447)),
             data.frame(ID=c("f","g","e"), value=c(1.4322822,-0.6506964,-0.2073807)))


rbindlist(datList)
#   ID      value
#1:  a  0.9101742
#2:  b  0.3841854
#3:  c  1.6821761
#4:  d -0.6357365
#5:  e -0.4616447
...

Или подмножество списка:

rbindlist(datList[c(1,3)])
#    ID      value
# 1:  a  0.9101742
# 2:  b  0.3841854
# 3:  c  1.6821761
# 4:  f  1.4322822
# 5:  g -0.6506964
# 6:  e -0.2073807
1 голос
/ 23 июня 2019

Как указано в комментариях @ PKumar , в базе R мы можем использовать do.call(rbind). Просто поместите это в функцию.

stackDataInList <- function(x) {
  return(do.call(rbind, x))
}

stackDataInList(L[1])  
#   ID     value
# 1  a 0.9101742
# 2  b 0.3841854
# 3  c 1.6821761

stackDataInList(L[c(1, 3, 4)])  
#    ID      value
# 1   a  0.9101742
# 2   b  0.3841854
# 3   c  1.6821761
# 4   f  1.4322822
# 5   g -0.6506964
# 6   h -0.2073807
# 7   i -0.3928079
# 8   j -0.3199929
# 9   k -0.2791133
# 10  l  0.4941883

Или используйте stack и mapply:

stackDataInList2 <- function(x) setNames(cbind.data.frame(stack(mapply(`[`, x, 1))[[1]],
                                                          stack(mapply(`[`, x, 2))[[1]]), 
                                         names(x[[1]]))

stackDataInList2(L[1])  
# ID     value
# 1  a 0.9101742
# 2  b 0.3841854
# 3  c 1.6821761
stackDataInList2(L[c(1, 3, 4)])  
# ID      value
# 1   a  0.9101742
# 2   b  0.3841854
# 3   c  1.6821761
# 4   f  1.4322822
# 5   g -0.6506964
# 6   h -0.2073807
# 7   i -0.3928079
# 8   j -0.3199929
# 9   k -0.2791133
# 10  l  0.4941883

Также Reduce - опция, найденная здесь

stackDataInList3 <- function(x) Reduce(rbind, x)
stackDataInList3(L[1])  
#   ID     value
# 1  a 0.9101742
# 2  b 0.3841854
# 3  c 1.6821761
stackDataInList3(L[c(1, 3, 4)]) 
#    ID      value
# 1   a  0.9101742
# 2   b  0.3841854
# 3   c  1.6821761
# 4   f  1.4322822
# 5   g -0.6506964
# 6   h -0.2073807
# 7   i -0.3928079
# 8   j -0.3199929
# 9   k -0.2791133
# 10  l  0.4941883

Данные

L <- list(structure(list(ID = c("a", "b", "c"), value = c(0.9101742, 
0.3841854, 1.6821761)), row.names = c(NA, -3L), class = "data.frame"), 
    structure(list(ID = c("d", "e"), value = c(-0.6357365, -0.4616447
    )), row.names = c(NA, -2L), class = "data.frame"), structure(list(
        ID = c("f", "g", "h", "i"), value = c(1.4322822, -0.6506964, 
        -0.2073807, -0.3928079)), row.names = c(NA, -4L), class = "data.frame"), 
    structure(list(ID = c("j", "k", "l"), value = c(-0.3199929, 
    -0.2791133, 0.4941883)), row.names = c(NA, -3L), class = "data.frame"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...