R - loop - 保存整个循环输出

时间:2013-04-22 06:17:34

标签: r loops for-loop

我的数据文件(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中保存了最后一个站而不是所有站。

2 个答案:

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