我有一个数据表,结构如下:
structure(list(GVKEY1 = c(2721, 113609, 62634, NA, 62599, 15855,
15855, NA, NA, NA), GVKEY2 = c(NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_
), GVKEY3 = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), GVKEY4 = c(NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_), GVKEY5 = c(NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_
)), .Names = c("GVKEY1", "GVKEY2", "GVKEY3", "GVKEY4", "GVKEY5"
), class = c("data.table", "data.frame"), row.names = c(NA, -10L
))
我想创建一个新列,它是所有五列的最大值。请注意,数据有很多NA。
我写了以下一行
patent <- patent[, GVKEY := lapply(.SD, max, na.rm = TRUE), .SDcols = c('GVKEY1', 'GVKEY2', 'GVKEY3', 'GVKEY4', 'GVKEY5')]
我得到以下输出。
警告讯息:
1:在[.data.table
中(专利,:=
(GVKEY,lapply(.SD,max,na.rm = TRUE)),:
提供了5个项目,分配给3280338列&#39; GVKEY&#39; (回收剩余3件物品) 2:在[.data.table
中(专利,:=
(GVKEY,lapply(.SD,max,na.rm = TRUE)),:
强制列出&#39; RHS到&#39;加倍&#39;匹配列的类型。将目标列更改为&#39; list&#39;首先(通过创建一个新的&#39;列表&#39;向量长度3280338(整个表的nrows)并指定它;即&#39;替换&#39;列),或强制RHS为&#39; double&#39; ; (例如1L,NA_ [real | integer] _,as。*等),使你的意图清晰,速度快。或者,请在创建表格时正确设置列类型,并坚持使用。
不确定我做错了什么。如果有人可以帮助我会很棒。
答案 0 :(得分:5)
您可以使用向量化pmax
函数与do.call
结合使用,以避免按行操作。这是使用data.table
和data.frame
都是列表(结帐is.list(patent)
),与将apply
转换为矩阵的data.table
相比较的事实。此外,正如评论中所述,:=
通过引用更新,因此请不要将其与<-
运算符结合使用
patent[, GVKEY := do.call(pmax, c(na.rm = TRUE, .SD))]
答案 1 :(得分:1)
对您进行细微更改,apply
代替lapply
,并且在使用:=
时,您不会使用<-
分配运算符*。
patent[, GVKEY := apply(.SD, 1, max, na.rm = TRUE), .SDcols = c('GVKEY1', 'GVKEY2', 'GVKEY3', 'GVKEY4', 'GVKEY5')]
*参考文献: