我正在尝试使用dplyr软件包中的filter
函数从符合条件的数据框中提取行。
我的数据框如下:
head(EIA)
length location stype rock dist ftype depth aspect degree drain TWI
1 len1 loc3 stype2 rock3 dist3 ftype1 depth2 asp2 degree2 drain4 TWI1
2 len4 loc2 stype2 rock3 dist1 ftype4 depth3 asp4 degree3 drain4 TWI3
3 len2 loc2 stype2 rock2 dist1 ftype4 depth3 asp1 degree2 drain4 TWI2
4 len4 loc2 stype2 rock3 dist2 ftype4 depth3 asp4 degree2 drain4 TWI2
5 len4 loc2 stype1 rock3 dist1 ftype2 depth3 asp1 degree3 drain4 TWI2
6 len4 loc3 stype2 rock2 dist1 ftype2 depth3 asp4 degree3 drain1 TWI2
,依此类推。总行数:10560
但是由于我试图在for循环中完成此工作,因此过滤器函数中的每个元素都必须与变量(colcol,aa,bb,cc)一起传递:
colcol
[1] "length" "location" "stype"
aa;bb;cc
[1] "len1"
[1] "loc2"
[1] "stype1"
我试图做这样的过滤功能,但是没有用:
filter(EIA, colcol[1] == aa & colcol[2] == bb & colcol[3] == cc)
结果必须提取两行。我认为这是由于colcol [1]元素周围的双引号引起的。我尝试使用as.symbol
,as.name
和noquote
函数删除这些引号,但是它们不起作用。
这个问题有解决方案吗?
谢谢。
答案 0 :(得分:1)
子集是此类问题的最佳解决方案
aa <- subset(EIA,EIA$lenght=='len1')
以上可能是您喜欢的示例以及简单而智能的解决方案。 您还可以使用和(&)条件提取行。
aa <- subset(EIA,EIA$lenght=='len1' & EIA$location=='loc2')
答案 1 :(得分:0)
将其转换为符号,然后求值
library(dplyr)
filter(EIA,!!sym(colcol[1]) == aa & !!sym(colcol[2]) == bb & !!sym(colcol[3]) == cc)
例如,当我们评估第一个条件时,我们得到
filter(EIA, !!sym(colcol[1]) == aa)
# length location stype rock dist ftype depth aspect degree drain TWI
#1 len1 loc3 stype2 rock3 dist3 ftype1 depth2 asp2 degree2 drain4 TWI1
数据
EIA <- structure(list(length = structure(c(1L, 3L, 2L, 3L, 3L, 3L),
.Label = c("len1", "len2", "len4"), class = "factor"), location = structure(c(2L,
1L, 1L, 1L, 1L, 2L), .Label = c("loc2", "loc3"), class = "factor"),
stype = structure(c(2L, 2L, 2L, 2L, 1L, 2L), .Label = c("stype1",
"stype2"), class = "factor"), rock = structure(c(2L, 2L,
1L, 2L, 2L, 1L), .Label = c("rock2", "rock3"), class = "factor"),
dist = structure(c(3L, 1L, 1L, 2L, 1L, 1L), .Label = c("dist1",
"dist2", "dist3"), class = "factor"), ftype = structure(c(1L,
3L, 3L, 3L, 2L, 2L), .Label = c("ftype1", "ftype2", "ftype4"
), class = "factor"), depth = structure(c(1L, 2L, 2L, 2L,
2L, 2L), .Label = c("depth2", "depth3"), class = "factor"),
aspect = structure(c(2L, 3L, 1L, 3L, 1L, 3L), .Label = c("asp1",
"asp2", "asp4"), class = "factor"), degree = structure(c(1L,
2L, 1L, 1L, 2L, 2L), .Label = c("degree2", "degree3"), class = "factor"),
drain = structure(c(2L, 2L, 2L, 2L, 2L, 1L), .Label = c("drain1",
"drain4"), class = "factor"), TWI = structure(c(1L, 3L, 2L,
2L, 2L, 2L), .Label = c("TWI1", "TWI2", "TWI3"), class = "factor")),
class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6"))
colcol <- c("length", "location", "dist")
aa <- "len1"
bb <- "loc2"
cc <- "stype1"