Привязать вектор со списком векторов, используя cbind - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть оригинал data.frame, и я хотел бы запустить lapply для определенных столбцов, а затем cbind для остальных столбцов с результатами операции lapply.

См. Код ниже.В идеале я хотел бы, чтобы b содержал первый id столбец из data.frame с результатами из lapply.Я предполагаю, что моя ошибка состоит в том, что мой list аргумент cbind содержит list списков ... первый аргумент list - это вектор, который может быть обработан, но второй аргумент является действительным list сама.Просто интересно, как с этим справиться.

Спасибо!

df <- data.frame(id = 1:10,
                 colB = 11:20,
                 colC = 21:30)

a <- lapply(df[,2:3],
            function(x) {x = 10 * x}
)

b <- do.call(cbind,
             list(df[,1],
                  a))

Создано в 2019-02-16 с помощью пакета prex (v0.2.0).

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

Разница тонкая, но важная: чтобы ваш код работал так, как вам нужно, вам нужно

b <- do.call(cbind, list(df[1], a))
#                        ^^^^^

Результат

b
#   id colB colC
#1   1  110  210
#2   2  120  220
#3   3  130  230
#4   4  140  240
#5   5  150  250
#6   6  160  260
#7   7  170  270
#8   8  180  280
#9   9  190  290
#10 10  200  300

Разница в том, что df[1] возвращаетdata.frame, а df[,1] возвращает вектор.cbind имеет метод для data.frame s, который вызывается методом get в вышеприведенном случае, но не в вашем случае.

0 голосов
/ 17 февраля 2019

Вы также можете использовать bind_cols() из пакета dplyr, который также может работать со списками.

library(dplyr)
bind_cols(df[1], a)

bind_cols() ожидает, что все аргументы будут либо фреймами данных, именованными списками или именованнымиаргументы.В этом случае вам также нужно написать df[1] вместо df[, 1].Однако, если вы явно дадите имя аргументу, также будет работать df[, 1]:

bind_cols(id = df[, 1], a)
0 голосов
/ 17 февраля 2019

Вы можете cbind только два data.frame с.

Итак, переписать b как:

b <- cbind(df[1], as.data.frame(a))

> b
   id colB colC
1   1  110  210
2   2  120  220
3   3  130  230
4   4  140  240
5   5  150  250
6   6  160  260
7   7  170  270
8   8  180  280
9   9  190  290
10 10  200  300

Обратите внимание, что df[1] используется для сохранения статуса data.frame.

...