我有一个原始的data.frame
,我想在某些列上运行lapply
,然后在cbind
的其余列上运行lapply
操作的结果。
请参见下面的代码。理想情况下,我希望b
包含id
的第一data.frame
列和lapply
的结果。我假设我的错误是我对list
的{{1}}参数包含列表的cbind
... list
的第一个参数是向量,可以处理,但是第二个参数是实际的list
本身。只是想知道如何处理。
谢谢!
list
由reprex package(v0.2.0)于2019-02-16创建。
答案 0 :(得分:3)
差异是微小的,但很重要:为了使代码按您希望的方式工作
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
的方法,在上述情况下会调用该方法,但在您的情况下不会这样。
答案 1 :(得分:1)
您只能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
的状态。
答案 2 :(得分:0)
您还可以使用bind_cols()
软件包中的dplyr
,它也可以使用列表。
library(dplyr)
bind_cols(df[1], a)
bind_cols()
期望所有参数都是数据帧,命名列表或命名参数。在这种情况下,这也是您需要写df[1]
而不是df[, 1]
的方式。但是,如果您明确命名该参数,那么df[, 1]
也会起作用:
bind_cols(id = df[, 1], a)