使用 cbind 将向量与向量列表绑定

Bind vector with list of vectors using cbind

我有一个原始 data.frame,我想 运行 lapply 在某些列上,然后 cbind 其余列的结果来自 lapply 操作。

见下面的代码。理想情况下,我希望 b 包含 data.frame 的第一个 id 列和 lapply 的结果。我假设我的错误是我 cbindlist 参数包含一个 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))

reprex package (v0.2.0) 创建于 2019-02-16。

你只能 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 状态。

区别很细微但很重要:为了让您的代码按照您希望的方式工作,您需要

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] returns一个data.framedf[,1] returns一个向量。 cbind 有一个用于 data.frames 的方法,在上面的例子中调用了 get,但在你的例子中没有。

您还可以使用 dplyr 包中的 bind_cols(),它也可以用于列表。

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

bind_cols() 期望所有参数都是数据框、命名列表或命名参数。在这种情况下,这也是您需要编写 df[1] 而不是 df[, 1] 的方式。但是,如果您明确命名参数,df[, 1] 也将起作用:

bind_cols(id = df[, 1], a)