如何在R中按组分组行?

时间:2015-09-14 08:42:51

标签: r loops subset

可能我的问题标题不合适,对不起。我有一个名为“table_parameter”的csv文件。 Please, download from here.。数据如下所示:

           time      Avg.PM10       sill      range       nugget
1   1   2012030101  52.269231   0.11054330  45574.072   0.037261216
2   2   2012030102  55.314286   0.20250974  87306.391   0.048315377
3   3   2012030103  56.038095   0.17711558  56806.827   0.034956709
4   4   2012030104  55.904762   0.16466350  104767.669  0.030752835
5   5   2012030105  57.123810   0.23638953  87306.391   0.037308364
6   6   2012030106  58.542857   0.24130317  87306.391   0.042108754
7   7   2012030107  60.066667   0.20362439  87306.391   0.037353980
8   8   2012030108  63.790476   0.19417801  87306.391   0.034144464
.
.
.

在我的数据框中,有一个名为time的变量,其中包含2012年3月1日至2012年3月7日期间数字形式的小时值。例如2012年3月1日,上午1点,写成2012030101等等。

我希望时间明确地对这个数据帧进行子集化。我想数据帧只包含每7天的早晨时间。早上时间是早上1点到早上5.00这意味着我想要一个包含所有值的数据帧属于2012030101到2012030105,2012030201到2012030205 .......... 2012030701到2012030705.换句话说,我想要一个数据帧如下所示:

              time      Avg.PM10      sill       range        nugget
1   49  49  2012030301  17.371429   0.7154449   48239.54    0.17163448
2   50  50  2012030302  17.811321   1.1201199   117603.55   0.12425337
3   51  51  2012030303  17.094340   0.5799705   55103.16    0.12061258
4   52  52  2012030304  16.679245   0.8486774   86725.77    0.15210005
5   53  53  2012030305  16.885714   1.2408621   154677.61   0.09743375
6   73  73  2012030401  21.619048   0.4417369   104767.67   0.08567888
7   74  74  2012030402  20.485714   2.0271124   215474.54   0.06340464
8   75  75  2012030403  20.552381   0.4509354   104767.67   0.06319812
9   76  76  2012030404  20.104762   0.4438798   104767.67   0.05639840
10  77  77  2012030405  20.133333   0.5050201   104767.67   0.09037341
.
.
.

为此,我写了这些代码:

table<-read.csv("table_parameter.csv")
table
table_morning<-subset(table, time %in% c(2012030101:2012030105,
                                         2012030201:2012030205,
                                         2012030301:2012030305,
                                         2012030401:2012030405,
                                         2012030501:2012030505,
                                         2012030601:2012030605,
                                         2012030701:2012030705) & Avg.PM10 <=30)
table_morning

但是这段代码效率不高。如你所见,我将所有小时值写入子集!如果想在90天内做同样的工作,那么效率非常低。那么,我该如何有效地进行这种子集化呢?如果您有任何疑问,请告诉我。

3 个答案:

答案 0 :(得分:1)

您可以使用下面的子字符串:

table_morning <- subset(table, substring(time, 9, 10) %in% c("01", "02","03","04", "05") & Avg.PM10 <=30)

答案 1 :(得分:1)

我会从时间中提取小时,然后相应地过滤。 例如:

library(dplyr) 
data_orpheus = read.csv('table_parameter.csv') 
data_orpheus$hour = as.numeric(substr(as.character(data_orpheus$time),9,10))
data_morning = data_orpheus %>% filter(hour >= 1 & hour <= 5)

dplyr运算符%>%不是必需的,您可以使用data_morning = data_orpheus[with(data_orpheus,hour >= 1 & hour <= 5)]进行过滤

更新

我还在学习dplyr,所以这里有一个漂亮的单行,可以做到这一切:

data_morning = read.csv('table_parameter.csv') %>%     # Read CSV
    mutate(hours = as.numeric(substr(time,9,10))) %>%  # Extract hours
    filter(hours >= 1 & hours <= 5) %>%                # Keep only mornings
    select(-hours)                                     # Drop hours, if not needed

head(data_morning)
   X       time Avg.PM10      sill     range     nugget
1  1 2012030101 52.26923 0.1105433  45574.07 0.03726122
2  2 2012030102 55.31429 0.2025097  87306.39 0.04831538
3  3 2012030103 56.03810 0.1771156  56806.83 0.03495671
4  4 2012030104 55.90476 0.1646635 104767.67 0.03075283
5  5 2012030105 57.12381 0.2363895  87306.39 0.03730836
6 25 2012030201 67.10476 0.1434977  72755.33 0.03003781

答案 2 :(得分:0)

非常感谢其他答案。我对未来优势的即兴回答:

table<-read.csv("table_parameter.csv")
times<- as.numeric(substr(table$time,9,10))
table_morning<- subset(table, times>=1 & times<=5 & Avg.PM10<=30)