2012-05-11 94 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)))