【问题标题】:How to subsetting rows group wise in R?如何在 R 中对行分组进行分组?
【发布时间】:2015-09-14 08:42:51
【问题描述】:

可能我的问题标题不合适,抱歉。我有一个名为“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 点。这意味着我想要一个数据框,其中包含属于 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天做同样的工作,那效率很低。那么,我怎样才能有效地做这个子集呢?如果您有任何进一步的疑问,请告诉我。

【问题讨论】:

  • 您可以在数据集中创建一个新变量“小时”(因为您的时间变量是数字,您可以尝试时间 %/% 100)。然后基于此子集。

标签: r loops subset


【解决方案1】:

你可以像下面这样使用子字符串:

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

【讨论】:

    【解决方案2】:

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

    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 运算符 %&gt;% 不是必需的,您可以使用 data_morning = data_orpheus[with(data_orpheus,hour &gt;= 1 &amp; hour &lt;= 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
    

    【讨论】:

      【解决方案3】:

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

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-08
        • 1970-01-01
        • 1970-01-01
        • 2013-01-31
        相关资源
        最近更新 更多