我有一个列名 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) 中的错误:一元运算符的参数无效”
谢谢您的帮助
如果您想使用子集并且要包含或排除大量相似名称的列,我通常会考虑使用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”开头的列。或者您可以将grep
withvalue =TRUE
与字符值结合使用:
subset(df, select= c("x", grep("^z", names(df), value=TRUE ) ) )
尝试:
df[names(df)!=tmp]
您的代码不起作用的原因是-c(tmp)
, wheretmp
是一个字符,计算结果为空。您只能使用这种排除数值的方式。
或者,这也可以:
subset(df, select=-which(names(df)==tmp))
因为which
返回一个数字。