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))

上面的代码将在循环 i 中用于访问需要从数据框中删除的某些元素

执行上述代码时,出现错误“-c(tmp) 中的错误:一元运算符的参数无效”

谢谢您的帮助

4

2 回答 2

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”开头的列。或者您可以将grepwithvalue =TRUE与字符值结合使用:

subset(df, select= c("x", grep("^z", names(df), value=TRUE ) ) )
于 2012-05-11T11:44:15.507 回答
1

尝试:

df[names(df)!=tmp]

您的代码不起作用的原因是-c(tmp), wheretmp是一个字符,计算结果为空。您只能使用这种排除数值的方式。

或者,这也可以:

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

因为which返回一个数字。

于 2012-05-11T10:51:28.553 回答