【问题标题】:Issues to filtre data from a data frame从数据框中过滤数据的问题
【发布时间】:2020-09-07 03:35:47
【问题描述】:

我还是 R 编程的新手,我在从数据框中过滤一些数据时遇到了一些问题。综上所述,我有一个 7 列和 8760 多行的数据框。

> mydata_B01 <- read.csv2(file = "analysis_spectro_1.csv")
> head(mydata_B01)
      Date         Value     Unit      RadLevel FlowLowOrHigh Maintenance Valid
1 01-01-2018 00:00 1.028e-07 mol       NA            NA       FALSE       TRUE
2 01-01-2018 01:00 1.050e-07 mol       NA            NA       FALSE       TRUE
3 01-01-2018 02:00 1.030e-07 mol       NA            NA       FALSE       TRUE
4 01-01-2018 03:00 0         mol       NA            NA       FALSE       TRUE
5 01-01-2018 03:30 1.040e-07 mol       NA            NA       FALSE       TRUE
6 01-01-2018 04:00 1.009e-07 mol       NA            NA       TRUE        FALSE
        ....

在 1 年内的每一小时,设备都会进行一次测量。 从这个数据框中,我选择了第 1、2、6 和 7 行,因为我稍后会在脚本中使用它们。

A_B01 <- na.omit(mydata_B01["Date"])
B_B01 <- na.omit(mydata_B01["Value"])
C_B01 <- na.omit(mydata_B01["Maintenance"])
D_B01 <- na.omit(mydata_B01["Valid"])

现在,当这4个条件都满足时,我想得到一个只包含mydata_B01行的数据框:

  • “值”=ou>大于0,
  • “维护”为“假”,
  • “有效”为“真”,
  • 当“日期”列包含“:00”时

因为实际上,在某些日子里,设备每 30 分钟测量一次,但我希望每小时只测量一次。换句话说,我想删除“日期”列中包含 ..:30 的行。

【问题讨论】:

    标签: r filter


    【解决方案1】:

    使用包dplyr 为您提供了一个简单的解决方案:

    mydata_B01 %>%
      filter(Value > 0 & 
             Maintenance == TRUE & 
             Valid == TRUE & 
             grepl(":00", Date))
    

    仅使用基础 R

    mydata_B01[mydata_B01$Value > 0 & 
               mydata_B01$Maintenance == TRUE & 
               mydata_B01$Valid == TRUE & 
               grepl(":00", mydata_B01$Date),]
    

    subset(mydata_B01, 
           mydata_B01$Value > 0 & 
           mydata_B01$Maintenance == TRUE & 
           mydata_B01$Valid == TRUE & 
           grepl(":00", mydata_B01$Date))
    

    正如@akrun 提到的,由于MaintenanceValid 是布尔值,所以上面的条件被简化为

    Value > 0 & 
    Maintenance & 
    Valid  & 
    grepl(":00", Date)
    

    mydata_B01$Value > 0 & 
    mydata_B01$Maintenance & 
    mydata_B01$Valid  & 
    mydata_B01$grepl(":00", Date)
    

    分别。

    【讨论】:

      【解决方案2】:

      不幸的是,这些方法都不起作用。 当我尝试时,我得到了答案“错误:尝试应用非功能”:

          Corrected <- mydata_B01$Value > 0 & 
            mydata_B01$Maintenance & 
            mydata_B01$Valid  & 
            mydata_B01$grepl(":00", Date)
      

      我尝试的时候得到了一个0行7列的新数据框:

          Corrected_my_data <- subset(mydata_B01, 
                 mydata_B01$Value > 0 & 
                 mydata_B01$Maintenance == TRUE & 
                 mydata_B01$Valid == TRUE & 
                 grepl(":00", mydata_B01$Date))
      

      在这种情况下,我认为问题在于日期的写入方式:“01-01-2018 00:00”

      我也试过这个,但它不会删除例如“29-10-2018 05:30”的行

          Corrected_values_B01 <- mydata_B01[mydata_B01[,6]!="TRUE" &         
          mydata_B01[,7]!="FALSE" & mydata_B01[,2]>0,]
      

      【讨论】:

        【解决方案3】:

        Ho 终于可以完美运行了:

        Corrected_my_data <- subset(mydata_B01, 
               mydata_B01$Value > 0 & 
               mydata_B01$Maintenance == TRUE & 
               mydata_B01$Valid == TRUE & 
               grepl(":00", mydata_B01$Date))
        

        我只需要将“Maintenance == TRUE”更改为“Maintenance == FALSE”:) 谢谢你们的帮助!

        【讨论】:

          猜你喜欢
          • 2015-07-21
          • 2012-02-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-28
          • 2021-04-13
          • 2016-08-11
          相关资源
          最近更新 更多