【问题标题】:How to get frequency count of date based on condition in R?如何根据 R 中的条件获取日期的频率计数?
【发布时间】:2019-12-05 14:03:20
【问题描述】:

下面是我的场景。

场景

我有两个数据框。第一个数据框包含有关系统使用情况的数据,另一个数据框包含有关系统位置的数据。我想根据系统的使用日期以及仪器所在的位置来跟踪仪器的使用情况。为此,我正在使用 dplyr 库对数据框执行外连接。接下来,我想根据日期获取系统的频率计数。为此,我在系统和位置上使用groupby。如果系统未使用,则该系统的频率计数应为 0。但是,当我查看位于位置 3 的系统 6 时。由于仪器未使用(无日期〜假设未使用),该系统的频率计数应为 0,因为日期或用户列不包含任何数据。但是,下面的代码返回的频率计数为 1。我不确定,可能是什么问题。下面是当前和预期的输出。

提供代码解释。

数据框 1:

df <- data.frame("Users" =c('A',"B","A",'C','B'), "Date" = c('17-03-2019','15-03-2019','11-03-2019','20-04-2019',"21-04-2019"), "Systems" = c("Sys1", "Sys1","Sys2","Sys3","Sys4"), stringsAsFactors = FALSE)
df
  Users       Date Systems
1     A 17-03-2019    Sys1
2     B 15-03-2019    Sys1
3     A 11-03-2019    Sys2
4     C 20-04-2019    Sys3
5     B 21-04-2019    Sys4

数据框 2

loc_df<-data.frame("Locations" =c('loc1','loc1','loc2','loc2','loc3'),"Systems" = c("Sys1","Sys2","Sys3","Sys4","Sys6"), stringsAsFactors = FALSE)
loc_df

  Locations Systems
1      loc1    Sys1
2      loc1    Sys2
3      loc2    Sys3
4      loc2    Sys4
5      loc3    Sys6

频率计数代码

#Merging df
merge_df<-join(df, loc_df,type = "full")
#Replcaing NA's with 0
merge_df[is.na(merge_df)] <- 0
merge_df

#Code for frequency count
merge_df %>%
  group_by(Systems,Locations)%>%
  summarise(frequency = n())

电流输出:

  Systems Locations frequency
  <chr>   <chr>         <int>
1 Sys1    loc1              2
2 Sys2    loc1              1
3 Sys3    loc2              1
4 Sys4    loc2              1
5 Sys6    loc3              1

预期输出

 Systems Locations frequency
  <chr>   <chr>         <int>
1 Sys1    loc1              2
2 Sys2    loc1              1
3 Sys3    loc2              1
4 Sys4    loc2              1
5 Sys6    loc3              0

【问题讨论】:

    标签: r dataframe dplyr plyr outer-join


    【解决方案1】:

    由于NAs 已经更改为 0 (merge_df[is.na(merge_df)] &lt;- 0),我们可以进行逻辑评估并得到 sum 而不是 n(),这将返回行数,这里的行是已经出现了

    library(dplyr)
    merge_df %>% 
       group_by(Systems, Locations) %>%
       summarise(frequeency = sum(Date != 0))
    # A tibble: 5 x 3
    # Groups:   Systems [5]
    #  Systems Locations frequeency
    #  <chr>   <chr>          <int>
    #1 Sys1    loc1               2
    #2 Sys2    loc1               1
    #3 Sys3    loc2               1
    #4 Sys4    loc2               1
    #5 Sys6    loc3               0
    

    除了将其更改为0,还可以使用sum(!is.na(Date)) 来完成,因为NA 比0 更合适

    【讨论】:

    • @akrun..能否请您扩展“已更改为 0”部分?
    • @biggboss2019 这是你的任务merge_df[is.na(merge_df)] &lt;- 0
    猜你喜欢
    • 2021-11-23
    • 2018-11-24
    • 2021-03-28
    • 2019-08-26
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 2021-05-16
    • 2020-12-14
    相关资源
    最近更新 更多