【问题标题】:subsetting data based on four columns using if else statements使用 if else 语句根据四列对数据进行子集化
【发布时间】:2020-11-17 00:37:04
【问题描述】:

我是 R 新手,在根据某些标准对我的数据进行子集化时遇到一些问题。我有五列(位置、地点、物种、日期、时间)。

我想要做的是根据上一条记录的时间是否比同一日期、同一物种、同一地点和同一位置的上一条记录的时间大于一小时来对我的数据进行子集化。如果前面的任何列与前面的列不同,我希望它忽略它并继续前进。

作为一个例子,这个数据框应该说前两条记录是独立的,因为时间列之前的所有列都是相同的,它们之间的间隔 = 或 > 大于 60 分钟,而最后一条记录是 59 分钟,因此不是独立的。

  Location       Site     Species    Date     Time
  Twelve         2        frog       14-10    13:45
  Twelve         2        frog       14-10    14:45
  Twelve         2        frog       14-10    15:44 

在这个例子中,前两行是独立的,但第三行是不同的物种,后面的行与第三行相同但位置不同。第五行,所有数据与上一行相同,只是又是相隔59分钟。

由此产生的结果应该返回前两行(两者相互独立), 第三行,因为它独立于前行和后行(因为物种不同 从前一行到后一行的不同位置),然后是第四行 与之前的行无关,最后一行不应显示在数据子集上 不独立于之前的线路(相隔

  Location       Site     Species    Date     Time
  Twelve         2        frog       14-10    13:45
  Twelve         2        frog       14-10    14:45
  Twelve         2        badger     14-10    15:44
  Thirteen       2        badger     14-10    16:44
  Thirteen       2        badger     14-10    17:42

【问题讨论】:

  • 对不起,如果有人可以帮忙提供解决方案,应该添加,因为我有大量数据需要使用解决方案
  • 这对您的问题有帮助吗?
  • @ChuckP 你在下面看到我的 cmets 了吗?
  • 对不起,我以为这早就死了。下面回答了

标签: r if-statement subset


【解决方案1】:

*** EDITED tp 包括 OP cmets ***

filter 仅用于独立行。 select 不显示临时列

df %>% 
  group_by(Location, Site, Species, Date) %>% 
  mutate(difftime = as.numeric(hms::as_hms(Time) - hms::as_hms(lag(Time, 1)))/3600) %>%
  mutate(independent = case_when(
    is.na(difftime) ~ TRUE,
    difftime >= 1 ~ TRUE,
    difftime < 1  ~ FALSE,
    TRUE ~ FALSE)
  ) %>% 
  filter(independent) %>%
  select(-difftime, -independent)
# A tibble: 4 x 5
# Groups:   Location, Site, Species, Date [3]
  Location  Site Species Date  Time  
  <chr>    <dbl> <chr>   <chr> <time>
1 Twelve       2 frog    14-10 13:45 
2 Twelve       2 frog    14-10 14:45 
3 Twelve       2 badger  14-10 15:44 
4 Thirteen     2 badger  14-10 16:44 
library(dplyr)
df %>% 
  group_by(Location, Site, Species, Date) %>% 
  mutate(difftime = as.numeric(Time - lag(Time, 1))/3600) %>%
  mutate(independent = case_when(
        is.na(difftime) ~ TRUE,
        difftime >= 1 ~ TRUE,
        difftime < 1  ~ FALSE,
        TRUE ~ FALSE)
   )
#> # A tibble: 6 x 7
#> # Groups:   Location, Site, Species, Date [3]
#>   Location  Site Species Date  Time   difftime independent
#>   <chr>    <dbl> <chr>   <chr> <time>    <dbl> <lgl>      
#> 1 Twelve       2 frog    14-10 13:45    NA     TRUE       
#> 2 Twelve       2 frog    14-10 14:45     1     TRUE       
#> 3 Twelve       2 frog    14-10 15:44     0.983 FALSE      
#> 4 Twelve       2 badger  14-10 15:44    NA     TRUE       
#> 5 Thirteen     2 badger  14-10 16:44    NA     TRUE       
#> 6 Thirteen     2 badger  14-10 17:42     0.967 FALSE

添加hms::as_hms 会使警告消息消失

df %>% 
  group_by(Location, Site, Species, Date) %>% 
  mutate(difftime = as.numeric(hms::as_hms(Time) - hms::as_hms(lag(Time, 1)))/3600) %>%
      mutate(independent = case_when(
        is.na(difftime) ~ TRUE,
        difftime >= 1 ~ TRUE,
        difftime < 1  ~ FALSE,
        TRUE ~ FALSE)
      )
#> # A tibble: 6 x 7
#> # Groups:   Location, Site, Species, Date [3]
#>   Location  Site Species Date  Time   difftime independent
#>   <chr>    <dbl> <chr>   <chr> <time>    <dbl> <lgl>      
#> 1 Twelve       2 frog    14-10 13:45    NA     TRUE       
#> 2 Twelve       2 frog    14-10 14:45     1     TRUE       
#> 3 Twelve       2 frog    14-10 15:44     0.983 FALSE      
#> 4 Twelve       2 badger  14-10 15:44    NA     TRUE       
#> 5 Thirteen     2 badger  14-10 16:44    NA     TRUE       
#> 6 Thirteen     2 badger  14-10 17:42     0.967 FALSE

您的数据

df <- readr::read_table2("Location       Site     Species    Date     Time
Twelve         2        frog       14-10    13:45
Twelve         2        frog       14-10    14:45
Twelve         2        frog       14-10    15:44
Twelve         2        badger     14-10    15:44
Thirteen       2        badger     14-10    16:44
Thirteen       2        badger     14-10    17:42")

【讨论】:

  • 嗨 Chuck,非常感谢您的回复,子集我的意思是我想要一个新的 df,其中只有行为“真”,没有您添加的额外两列。那有可能吗?我也想知道,让我学习,你能不能给我解释一下代码?因为我看不到它在哪里检查位置与之前的行相同,或者站点与之前的行相同,所以日期和物种与之前的行相同,如果是,则应用 1hr: ( is.na(difftime) ~ TRUE, difftime >= 1 ~ TRUE, difftime
  • 如果任何一列与之前的行不同,那么它将独立于之前的行,无论它们之间是否有一个小时。
  • 我更新了答案。 group_by 声明将它们混为一谈,因此只要位置、地点、物种和日期发生变化,它就是一个新的群体,我们再次开始寻求独立。 lag 命令回溯一行以比较时间,但它是按组进行的。
  • 嗨 Chuck,我已经检查了不同的数据子集并且工作正常。感谢您的帮助,您为我节省了大量时间。
  • 感谢您检查绿色复选标记。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
相关资源
最近更新 更多