名为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;。
答案 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);另一方面,如果将数据存储为文本文件,则数据占用略微更多空间,更重要的是,将文件中的其他元数据(如单元)与数据相结合变得更加困难。 ..