尝试使用sapply进行子集设置时R中未定义的列选择错误

时间:2018-11-22 16:05:09

标签: r

在过去的一个小时里,我一直在努力工作,下面的代码在几个小时前就可以正常工作了,现在我不知道为什么现在不行了。我搜索了有关未定义的列选定错误的其他问题,但我想我已经更正了那些答案中的所有信息。我确定有一些小事我已经忽略或意外遗忘了,但我看不到!

我有一个既包含因子变量又包含数值变量的数据框,我想对其进行子集化,以便保留所有因子变量,并删除列均值<0.1的数值变量。

我在关于stackoverflow的另一个问题上找到了以下代码,对该问题进行了稍加修改就可以很好地在我的测试数据上工作(在较大的3GB对象上尝试代码之前,我正在使用较小的子数据集进行测试)

meanfunction01 <- function(x){
    if(is.numeric(x)){
        mean(x) > 0.1
      } else {
    TRUE}
}

#then apply function to data table
Zdata <- Data1[,sapply(Data1,  meanfunction01)]

我发誓几个小时前我在使用它,然后当我回到它并尝试再次使用它时,它停止工作,现在只返回以下错误:

Error in `[.data.frame`(Data1, , sapply(Data1, meanfunction01)) : 
  undefined columns selected

我试图修改该函数,以使其遍历多个对象(我有54个对象要应用到该对象,并且不想手动键入所有对象),但是我不认为我进行了编辑原始功能,现在已停止工作。

我的数据的简短str():

> str(Data1[1:10])
'data.frame':   11 obs. of  10 variables:
 $ Name               : Factor w/ 11688 levels "GTEX-1117F-0226-SM-5GZZ7",..: 8186 8242 8262 8270 8343 8388 8403 8621 8689 8709 ...
 $ SEX                : Factor w/ 2 levels "Female","Male": 1 2 2 1 1 2 2 1 2 1 ...
 $ AGE                : Factor w/ 6 levels "20-29","30-39",..: 4 4 1 3 3 1 3 3 3 2 ...
 $ CIRCUMSTANCES: Factor w/ 5 levels "0","1","2","3",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Tissue.x           : Factor w/ 53 levels "Adipose_Subcutaneous",..: 7 7 7 7 7 7 7 7 7 7 ...
 $ ENSG00000223972.4  : num  0 0.0701 0.0339 0.1149 0.0549 ...
 $ ENSG00000227232.4  : num  12.5 17.2 13.1 16 15.7 ...
 $ ENSG00000243485.2  : num  0.0717 0 0.1508 0 0.061 ...
 $ ENSG00000237613.2  : num  0 0.0654 0 0.0402 0.0768 ...
 $ ENSG00000268020.2  : num  0 0.0421 0.0611 0 0 ...

1 个答案:

答案 0 :(得分:1)

因此,如果唯一的问题是更改data.frame中的整数变量的类,但您有许多列(> 10000),则可能需要考虑将data.frame转换为data.table。您的代码将如下所示:

library(data.table)
Data1<-data.table(Data1) #or if you have your data in csv document just use fread instead of read.csv which will automatically give you a data.table.

然后,您只需要使用以下方法找到整数列:

which(sapply(Data1,is.integer))

使用data.table命令完全将其放入:

Data1[,which(sapply(Data1,is.integer)):=lapply(.SD,as.numeric),.SDcols=which(sapply(Data1,is.integer))]

请注意,由于data.table使用指针,因此不需要将上述代码行分配给任何内容,这使指针比data.frame或tibbles对象快得多。因此,运行上面的行将有效地更新您的Data1对象。其他非整数列的类别(即因素)将保持不变。

如果您还有其他问题,请进行更新,但这应该可以回答您的评论。祝你好运!