我的数据文件(obs)看起来大致如此(只有前六行用于说明)
date time station variable 1 variable 2
22/04/2013 05 10394 4 3
22/04/2013 04 10393 3 5
22/04/2013 07 10389 6 6
22/04/2013 04 20987 8 1
22/04/2013 02 29483 9 3
22/04/2013 03 49893 5 7
对于具有不同站数的多个区域,我有不同的站号列表。我想设置一个条件,如果站号包含在站列表中,那么具有该站号的原始数据文件(obs)中的行应保存到变量test03,而不是保存到具有站号的行。未列入清单。
示例电台列表:
10394
10393
10389
29483
只有四个电台,我这样做了:
bed <- (obs$station == 10394 | obs$station == 10393 | obs$station == 10389 | obs$station == 29483)
test03 <- obs[bed,]
然后test03看起来像这样:
date time station variable 1 variable 2
22/04/2013 05 10394 4 3
22/04/2013 04 10393 3 5
22/04/2013 07 10389 6 6
22/04/2013 02 29483 9 3
到目前为止,这一切都很顺利。但是,如果我不想单独输入每个电台(如果我有超过100个电台),我怎么能这样做呢?我用for循环尝试了它,但后来我只在test03中保存了最后一个站而不是所有站。
答案 0 :(得分:1)
我能想到的两种快捷方式:
如果每个工作站的数据框中都有一行,那么match
很有可能:
df <- data.frame( stations = letters[1:26] , var = runif(26) )
stations <- c("a","b","j")
df[ match( stations , df$stations ) , ]
stations var
1 a 0.311261693
2 b 0.002061808
10 j 0.343057454
如果数据框中的每个工作站都有多个条目,那么使用%in%
运算符进行子集化应该可以完成您的工作:
df[ df$stations %in% stations , ]
stations var
1 a 0.311261693
2 b 0.002061808
10 j 0.343057454
答案 1 :(得分:0)
使用%in%
测试所有列表。例如:
transform(obs,
bed = station %in% c(10394,10393,10389,29483))
date time station variable1 variable2 bed
1 22/04/2013 5 10394 4 3 TRUE
2 22/04/2013 4 10393 3 5 TRUE
3 22/04/2013 7 10389 6 6 TRUE
4 22/04/2013 4 20987 8 1 FALSE
5 22/04/2013 2 29483 9 3 TRUE
6 22/04/2013 3 49893 5 7 FALSE
或更简单地只获得正确的行:
obs[obs$station %in% c(10394,10393,10389,29483),]
date time station variable1 variable2
1 22/04/2013 5 10394 4 3
2 22/04/2013 4 10393 3 5
3 22/04/2013 7 10389 6 6
5 22/04/2013 2 29483 9 3