作为示例,我创建了一个包含数据帧列名称的小向量,我想循环这些变量,以删除变量i
等于列名称的列中的某些值>
创建矢量:
Ellenberg_value<- c( "VOCHTIND", "ZUURGIND", "STIKSIND", "ZOUT_IND")
For循环:
for (i in Ellenberg_value) {
Ecobase<- Ecobase[!Ecobase$i== "X",]
Ecobase<- Ecobase[!Ecobase$i== "?",]
}
我希望输出数据框没有X和?在向量中指定的列内。但是,现在我得到一个空的数据框
答案 0 :(得分:0)
当列名存储为字符向量时,必须使用另一种机制(使用[[
而不是$
进行子集设置。一个例子:
df <- data.frame(a = 1 ,b = 3)
cols <- names(df)
以下按预期工作:
for (i in cols) {
print(i)
print(df[[i]])
}
[1] "a"
[1] 1
[1] "b"
[1] 3
您的代码没有:
for (i in cols) {
print(i)
print(df$i)
}
[1] "a"
NULL
[1] "b"
NULL
因此,您可以在代码中使用Ecobase[!Ecobase[[i]] == "X", ]
。
答案 1 :(得分:0)
我认为不需要循环。如果我理解正确,那么您想删除至少"VOCHTIND", "ZUURGIND", "STIKSIND", "ZOUT_IND"
列等于"X"
的行,那是正确的吗?
Ecobase[rowSums(Ecobase[,Ellenberg_value] == "X") == 0,]
如果要用“?”除去行您也可以这样做:
Ecobase[rowSums(sapply(Ecobase[Ellenberg_value], '%in%', c("X", "?"))) == 0,]