For循环变量作为列名

时间:2019-04-25 09:46:26

标签: r loops for-loop

作为示例,我创建了一个包含数据帧列名称的小向量,我想循环这些变量,以删除变量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和?在向量中指定的列内。但是,现在我得到一个空的数据框

2 个答案:

答案 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,]