Назначьте результаты do.call с использованием cbind для фреймов данных - PullRequest
0 голосов
/ 20 ноября 2018

Я хочу объединить несколько наборов из двух фреймов данных (a & a_1, b & b_1 и т. Д.). По сути, я хочу сделать то, что этот вопрос задает. Я создал список из двух моих наборов данных:

# create data 
a <- c(1, 2, 3)
b <- c(2, 3, 4)
at0H0 <- data.frame(a, b)

c <- c(1, 2, 3)
d <- c(2, 3, 4)
at0H0_1 <- data.frame(c, d)

e <- c(1, 2, 3)
f <- c(2, 3, 4)
at0H1 <- data.frame(a, b)

g <- c(1, 2, 3)
h <- c(2, 3, 4)
at0H1_1 <- data.frame(c, d)

# create lists of names
names <- list("at0H0", "at0H1")
namesLPC <- list("at0H0_1", "at0H1_1")

# column bind the data frames?
dfList <- list(cbind(names, namesLPC))
do.call(cbind, dfList)

Но теперь мне нужно создать кадры данных для каждого. Эта функция do.call просто создает список имен фреймов данных. Спасибо!

(отредактировано для создания воспроизводимого кода)

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Я нашел способ сделать это.Несколько замечаний: у меня есть 360 наборов данных, которые мне нужно объединить, поэтому это i in 1:360.Это также называет наборы данных из массива имен наборов данных (который dataNames)

for (i in 1:360){
  assign(paste(dataNames[i], sep = ""), cbind(names[[i]], namesLPC[[i]]))
}
0 голосов
/ 20 ноября 2018

Это не супер прямолинейно, но с небольшим редактированием функции присоединения вы можете получить ее:

joinfun <- function(x) do.call(cbind, unname(mget(x,inherits=TRUE)))
lapply(Map(c, names, namesLPC), joinfun)
#[[1]]
#  a b c d
#1 1 2 1 2
#2 2 3 2 3
#3 3 4 3 4
# 
#[[2]]
#  a b c d
#1 1 2 1 2
#2 2 3 2 3
#3 3 4 3 4

Функция Map объединяет имена наборов данных по мере необходимости:

Map(c, names, namesLPC)
#[[1]]
#[1] "at0H0"   "at0H0_1"
#
#[[2]]
#[1] "at0H1"   "at0H1_1"

Затем lapply перебирает каждую часть вышеуказанного list до mget (множественное получение) каждого объекта в объединенный list.Например, для первой части:

unname(mget(c("at0H0","at0H0_1"),inherits=TRUE))
#[[1]]
#  a b
#1 1 2
#2 2 3
#3 3 4
#
#[[2]]
#  c d
#1 1 2
#2 2 3
#3 3 4

Наконец, do.call(cbind, ...) возвращает объединенный list в один data.frame:

do.call(cbind, unname(mget(c("at0H0","at0H0_1"),inherits=TRUE)))
#  a b c d
#1 1 2 1 2
#2 2 3 2 3
#3 3 4 3 4
...