首页 > 解决方案 > 尝试使用 sapply 进行子集化时,未定义的列在 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 ...

标签: r

解决方案


因此,如果您唯一的问题是更改 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 对象。其他非整数列(即因子)的类将保持不变。

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


推荐阅读