在R中连续获得最大值

时间:2016-02-28 06:05:13

标签: r max data.table

我有一个数据表,结构如下:

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。*等),使你的意图清晰,速度快。或者,请在创建表格时正确设置列类型,并坚持使用。

不确定我做错了什么。如果有人可以帮助我会很棒。

2 个答案:

答案 0 :(得分:5)

您可以使用向量化pmax函数与do.call结合使用,以避免按行操作。这是使用data.tabledata.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')]

*参考文献: