不能使用Apply with data table

时间:2016-03-30 11:32:50

标签: r

我有一个数据框,我按以下方式读入R

Selector(Class.methodName)

然后我想创建一个名为"的高级专栏"在哪里" 1"如果导入数据中的任何列(其中28个)等于" 1065"或者" 1072",否则为0。因此我使用了:

morbiditydata <-fread("data.csv", nrows=502647, select=c(2458:2486))

然而,这会产生错误

  

dim(X)必须具有正长度

我该如何解决这个问题?

如果有帮助,这将产生类似的表格:

morbiditydata$hypertens<-apply(morbiditydata[,c(1:28)], MARGIN=1, function(x) {ifelse(x==1065 | x==1072, "1","0")})

1 个答案:

答案 0 :(得分:0)

我们可以使用data.table方法

 nm1 <- names(morbiditydata)[1:28]
 morbiditydata[, (nm1) := lapply(.SD, function(x) 
      as.integer(x %in% c(1065, 1072))), .SDcols = nm1]

关于OP代码中的错误,data.table中的列在使用数字索引时使用with=FALSE进行了子集化,即

 t(apply(morbiditydata[,1:28, with = FALSE], 1, 
      function(x) {ifelse(x==1065 | x==1072, "1","0")}))

使用OP的例子'df'

 nm1 <- names(df)[1:2]
 setDT(df)[, (nm1) := lapply(.SD, function(x)
       as.integer(x %in% c(1065, 1072)))  ,.SDcols = nm1]
 df
#   a b    c
#1: 0 0 9999
#2: 0 1 1065
#3: 1 1 1072
#4: 1 1 1072
#5: 0 0    0
#6: 0 0    1

数据

set.seed(24)
morbiditydata <- as.data.table(matrix(sample(c(1065, 
      1072, 1:5), 5*30, replace=TRUE), ncol=30))