2012-05-11 90 views
1

我有一個數據框,列名爲z_1,z_2至z_200。在下面的例子中,爲了便於表示,我只示出Z_1訪問數據框中的列名稱

df <- data.frame(x=1:5, y=2:6, z_1=3:7, u=4:8) 
df 
i=1 
tmp <- paste("z",i,sep="_") 
subset(df, select=-c(tmp)) 

上面的代碼將在一個循環我用於訪問需要被從數據幀

雖然除去某些元件執行上面的代碼,我得到的錯誤「在C(TMP)錯誤:無效的參數,以一元運算符」

謝謝您的幫助

+0

又見這個問題的答案:[刪除列R的數據框(http://stackoverflow.com/questions/4605206/drop-columns -r-數據幀) –

回答

1

嘗試:

df[names(df)!=tmp] 

你的代碼不工作的原因是因爲-c(tmp),其中tmp是一個字符,評估爲無。您可以使用這種僅用數值排除的方式。

或者這也將工作:

subset(df, select=-which(names(df)==tmp)) 

因爲which返回一個數字。

1

我想要使用子集,並有大量的相似名稱列包含或排除,我通常考慮使用grepl構建匹配列名的邏輯向量(或者你可以用它來構造一個數字矢量一樣容易)。結果的否定會刪除列

df <- data.frame(x=1:5, y=2:6, z_1=3:7, u=4:8) 
df 
i=1 
tmp <- paste("z",i,sep="_") 
subset(df, select= !grepl("^z", names(df))) 
    x y u 
1 1 2 4 
2 2 3 5 
3 3 4 6 
4 4 5 7 
5 5 6 8 

隨着否定這可以讓你刪除(或沒有它包括)的所有列的開始「Z」使用該模式。或者你也可以結合使用grepvalue =TRUE與字符值:

subset(df, select= c("x", grep("^z", names(df), value=TRUE)))