我有一个数据表,结构如下:
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
))
Run Code Online (Sandbox Code Playgroud)
我想创建一个新列,它是所有五列的最大值.请注意,数据有很多NA.
我写了以下这一行
patent <- patent[, GVKEY := lapply(.SD, max, na.rm = TRUE), .SDcols = c('GVKEY1', 'GVKEY2', 'GVKEY3', 'GVKEY4', 'GVKEY5')]
Run Code Online (Sandbox Code Playgroud)
我得到以下输出.
警告信息:
1:In[.data.table(专利,,:=(GVKEY,lapply(.SD,max,na.rm = TRUE)),:
提供5项要分配给'GVKEY'栏的3280338项(回收剩余的3项) )
.2:In[.data.table(专利,:=(GVKEY,lapply(.SD,max,na.rm = TRUE)),:
强制'列出'RHS为'double'以匹配列的类型.将目标列更改为' list'首先(通过创建一个新的'list'向量长度3280338(整个表的nrows)并分配;即'replace'列),或强制RHS为'double'(例如1L,NA_ [real | integer] _, as.*,etc)使你的意图清晰明了,速度也很快.或者,当你创建表并坚持下去时,请在前面正确设置列类型.
不确定我做错了什么.如果有人可以帮助我会很棒.
您可以pmax结合使用矢量化函数,do.call以避免通过行操作.这是使用data.table并且data.frame都是列表(检出is.list(patent))的事实,与之相比,apply它转换data.table为矩阵.另外,如评论中所述,:=更新时请参考,请不要将其与<-运营商结合使用
patent[, GVKEY := do.call(pmax, c(na.rm = TRUE, .SD))]
Run Code Online (Sandbox Code Playgroud)