2011-06-25 72 views
2

我想將變量粘貼到我用於子集數據的邏輯表達式中,但子集函數在粘貼時不會將它們看作列名(不帶引號的ot)。如何將文本和變量粘貼到R中的邏輯表達式中?

我有一個名爲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) 
} 

我找不到答案;有什麼建議麼?

回答

1

這裏有幾個選項更接近賈斯珀的方法。首先,你可以定義的列名作爲獨立的變量,然後用它來從data.frame選擇變量,就好像它是一個list(因爲data.frame基本上是一個list):

for(k in 1:2){ 
    colname <- paste("col",k,sep="") 
    subsetdata <- dataframe[dataframe[[colname]] < 0.05, ] 
} 

或者你可以參考列名這樣:

subsetdata <- dataframe[dataframe[colname,] < 0.05, ] 

最後,你可以使用subset,雖然你需要提供一個邏輯表達式(由約書亞烏爾裏希指出):

subsetdata <- subset(dataframe, eval(substitute(x < 0.05, list(x = as.name(colname))))) 
+0

Thansk Nullglob!並感謝拼寫出如何傳遞和評估變量爲子集! – Jasper

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,] 
+0

謝謝約書亞,這是一個很好的方法,是有道理的。 – Jasper

0

我不太清楚你正在嘗試做什麼,但也許看到&|用於subset操作將是有幫助的。

兩個col1col2小於0.05:小於0.05

subsetdata<-subset(dataframe, col1 < 0.05 & col2 < 0.05) 

無論col1col2

subsetdata<-subset(dataframe, col1 < 0.05 | col2 < 0.05) 

約書亞的答案是超多列更容易這樣做的一個很好的方式。

+0

謝謝Aaron,我需要粘貼變量for循環許多不同的列combis(爲此,我可以使用Joshua的答案)。 – Jasper