我想将变量粘贴到我用于子集数据的逻辑表达式中,但子集函数在粘贴时不会将它们看作列名(ot不带引号)。
我有一个名为col1,col2等列的数据框。我想为其中colx<的行进行子集化。 0.05
这项工作:
subsetdata<-subset(dataframe, col1<0.05)
subsetdata<-subset(dataframe, col2<0.05)
这不起作用:
for (k in 1:2){
subsetdata<-subset(dataframe, paste("col",k,sep="")<0.05)
}
for (k in 1:2){
subsetdata<-subset(dataframe, noquote(paste("col",k,sep=""))<0.05)
}
我找不到答案;有什么建议吗?
答案 0 :(得分:9)
通过尝试使用subset
,你所做的事情要比它需要的要困难得多。请注意,?subset
表示第二个参数(也称为子集)必须是表达式,并且您没有给它一个表达式:
> is.expression(paste("col",1:2,sep="")<0.05)
[1] FALSE
您可以构建一个未评估的表达式,然后在将其传递给subset
时对其进行评估,但有更简单的方法。例如:只需利用<
运算符的向量化特性。
# sample data
set.seed(21)
dataframe <- data.frame(col1=rnorm(10),col2=rnorm(10),col3=1)
logicalCols <- dataframe[,paste("col",1:2,sep="")] < 0.05
# col1 col2
# [1,] FALSE TRUE
# [2,] FALSE FALSE
# [3,] FALSE TRUE
# [4,] TRUE FALSE
# [5,] FALSE FALSE
# [6,] FALSE FALSE
# [7,] TRUE FALSE
# [8,] TRUE FALSE
# [9,] FALSE TRUE
# [10,] TRUE TRUE
ANY <- apply(logicalCols, 1, any) # any colx < 0.05
ALL <- apply(logicalCols, 1, all) # all colx < 0.05
dataframe[ANY,]
dataframe[ALL,]
答案 1 :(得分:1)
以下是几个更接近Jasper方法的选项。首先,您可以将列名定义为单独的变量,然后使用它从data.frame
中选择变量,就好像它是list
一样(因为data.frame
基本上是{{1} 1}}):
list
或者你可以这样引用列名:
for(k in 1:2){
colname <- paste("col",k,sep="")
subsetdata <- dataframe[dataframe[[colname]] < 0.05, ]
}
最后,你可以使用 subsetdata <- dataframe[dataframe[colname,] < 0.05, ]
,虽然你需要提供一个逻辑表达式(如Joshua Ulrich所指出的):
subset
答案 2 :(得分:0)
我不太清楚你要做什么,但也许在&
操作中看到|
和subset
会有所帮助。
col1
和col2
都小于0.05:
subsetdata<-subset(dataframe, col1 < 0.05 & col2 < 0.05)
col1
或col2
小于0.05:
subsetdata<-subset(dataframe, col1 < 0.05 | col2 < 0.05)
Joshua的答案是在很多专栏上更容易做到这一点的好方法。