如何删除具有二项变量的数据集中的列

时间:2011-11-25 12:12:30

标签: r indexing dataframe

名为data的数据集包含分类和连续变量。我想删除分类变量。

我试过了:

data.1 <- data[,colnames(data)[[3L]]!=0]

没有打印错误,但是分类变量保留在数据中。问题在哪里?

&#34; head(data)&#34;的摘要是

id        1,2,3,4,... 
age       45,32,54,23,...
status    0,1,0,0,...
 ...
(more variables like as I wrote above)

所有变量都定义为&#34;因子&#34;。

3 个答案:

答案 0 :(得分:2)

你想用这段代码做什么?首先,colnames(data)不是列表,所以使用[[]]没有意义。其次,您唯一测试的是第三列名称是否不等于零。由于列名永远不能以数字开头,因此几乎总是如此。所以你的代码转换为:

data1 <- data[,TRUE]

不是你打算做的事。

我想你知道二项式的含义。一种方法是定义你自己的函数is.binomial(),如下所示:

is.binomial <- function(x,na.action=c('na.omit','na.fail','na.pass'){
    FUN <- match.fun(match.arg(na.action))
    length(unique(FUN(x)))==2
}

如果你想照顾NA的话。然后,您可以将其应用于您的数据框:

data.1 <- data[!sapply(data,is.binomial)]

这样您就可以删除所有二项列,即只有两个不同值的列。

答案 1 :(得分:0)

@Shimpei Morimoto,

我认为你需要一种不同的方法。 分类变量是否在数据框中定义为因子? 如果是这样,你可以使用:

  

data.1&lt; - data [,!apply(data,2,is.factor)]

您现在执行的测试是名称编号3L不是0。 我认为情况并非如此。

另一种方法是

  

data.1&lt; - data [, - 3L]

仅当3L是数字且唯一具有分类变量的列

时才有效

答案 2 :(得分:0)

我想你已经到了那里,你对@Mischa Vreeburg的最后评论。可能(正如您的建议)重新格式化原始数据文件,但您也应该能够解决R中的问题。我无法完全复制您所遇到的undefined columns错误。

构建一些看起来与您的数据尽可能相似的数据:

X <- read.csv(textConnection(
"id,age,pre.treat,status
  1,'27', 0,0
  2,'35', 1,0
  3,'22', 0,1
  4,'24', 1,2
  5,'55', 1,3
   ,  ,yes(vs)no,"),
  quote="\"'")

看看:

str(X)

'data.frame':   6 obs. of  4 variables:
 $ id       : int  1 2 3 4 5 NA
 $ age      : int  27 35 22 24 55 NA
 $ pre.treat: Factor w/ 3 levels " 0"," 1","yes(vs)no": 1 2 1 2 2 3
 $ status   : int  0 0 1 2 3 NA

定义@Joris Mey的功能:

is.binomial <- function(x,na.action=c('na.omit','na.fail','na.pass')) {
    FUN <- match.fun(match.arg(na.action))
    length(unique(FUN(x)))==2
}

尝试一下:你会发现检测pre.treat为二项式,并保留所有变量。

sapply(X,is.binomial)
X1 <- X[!sapply(X,is.binomial)]
names(X1)
## keeps everything

我们可以删除最后一行并再试一次:

X2 <- X[-nrow(X),]
sapply(X2,is.binomial)

一般情况下,R不希望级别ID等“无关”信息与数据本身位于同一列。一方面,你可以在R世界中做得更好,只需将数据保留为原始的,有意义的值(“不”,“是”或“健康”,“生病”而不是0,1);另一方面,如果将数据存储为文本文件,则数据占用略微更多空间,更重要的是,将文件中的其他元数据(如单元)与数据相结合变得更加困难。 ..