Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分组后R中的秩函数_R_Dataframe_Rank - Fatal编程技术网

分组后R中的秩函数

分组后R中的秩函数,r,dataframe,rank,R,Dataframe,Rank,如何使用R创建列组列?下面是一个示例 这就是我所拥有的: Date group 12/5/2020 A 12/5/2020 A 11/7/2020 A 11/7/2020 A 11/9/2020 B 11/9/2020 B 10/8/2020 B 这就是我想要的: Date group rank 12/5/2020 A 2 12/5/2020 A 2 11/7/2020 A

如何使用R创建列组列?下面是一个示例
这就是我所拥有的:


Date       group
12/5/2020    A
12/5/2020    A
11/7/2020    A
11/7/2020    A
11/9/2020    B
11/9/2020    B
10/8/2020    B
这就是我想要的:

Date       group   rank
12/5/2020    A      2
12/5/2020    A      2
11/7/2020    A      1
11/7/2020    A      1
11/9/2020    B      2
11/9/2020    B      2
10/8/2020    B      1
三角帆 (我在这里使用的是
dplyr
,因为我认为很容易看到正在执行的步骤。)

第一种方法可能是利用R的
factor
函数,该函数为每个不同的值分配一个整数,因此对该
factor
的操作更快(与字符串相比)。也就是说,它获取一个字符串向量(可能是loooong),并将其转换为一个与之相同长的整数向量(更小更快)和一个非常短的字符串向量,其中整数是字符串小向量的索引。这个小向量称为因子的“水平”

库(dplyr)
分组依据(日期,分组)%>%
变异(秩=as.integer(因子(日期)))%>%
解组()
##tibble:7 x 3
#日期组等级
#         
#1 2020年12月5日A 2
#2020年12月5日A 2
#3 2020年11月7日A 1
#4 2020年11月7日A 1
#5 2020年11月9日B 2
#6 2020年11月9日B 2
#7 2020年10月8日B 1
这一“分类”有效,但存在两个问题:

  • 这取决于
    Date
    列的词典排序,对于该列,此数据样本是可接受的,但这将失败。更好的方法是转换为更适合排序的对象,例如
    Date
    对象

    失败排序:

    排序(c(“2020年9月12日”、“2020年9月11日”、“2020年9月2日”)) # [1] "11/9/2020" "12/9/2020" "2/9/2020"
  • dat%>%
    变异(日期=as.Date(日期,格式=“%m/%d/%Y”))%>%
    分组依据(分组)%>%
    变异(秩=as.integer(因子(日期)))%>%
    解组()
    ##tibble:7 x 3
    #日期组等级
    #         
    #1 2020-12-05 A 2
    #2 2020-12-05 A 2
    #3 2020-11-07 A 1
    #4 2020-11-07 A 1
    #5 2020-11-09 B 2
    #6 2020-11-09 B 2
    #7 2020-10-08 B 1
    

  • 确实有更好的排名功能,例如
    dplyr::densite_rank
    (这是@akrun首先给出的答案…老实说,我一直在构建):
  • dat%>%
    变异(日期=as.Date(日期,格式=“%m/%d/%Y”))%>%
    分组依据(分组)%>%
    变异(等级=密集等级(日期))%>%
    解组()
    ##tibble:7 x 3
    #日期组等级
    #         
    #1 2020-12-05 A 2
    #2 2020-12-05 A 2
    #3 2020-11-07 A 1
    #4 2020-11-07 A 1
    #5 2020-11-09 B 2
    #6 2020-11-09 B 2
    #7 2020-10-08 B 1
    
    在将“日期”转换为
    Date
    类后,我们可以使用
    densite\u-rank

    library(dplyr)
    library(lubridate)
    df1 %>% 
          group_by(group) %>% 
          mutate(rank = dense_rank(mdy(Date)))
    # A tibble: 7 x 3
    # Groups:   group [2]
    #  Date      group  rank
    #  <chr>     <chr> <int>
    #1 12/5/2020 A         2
    #2 12/5/2020 A         2
    #3 11/7/2020 A         1
    #4 11/7/2020 A         1
    #5 11/9/2020 B         2
    #6 11/9/2020 B         2
    #7 10/8/2020 B         1
    
    库(dplyr)
    图书馆(lubridate)
    df1%>%
    分组依据(分组)%>%
    突变(秩=密集秩(mdy(日期)))
    #一个tibble:7x3
    #分组:分组[2]
    #日期组等级
    #        
    #1 2020年12月5日A 2
    #2020年12月5日A 2
    #3 2020年11月7日A 1
    #4 2020年11月7日A 1
    #5 2020年11月9日B 2
    #6 2020年11月9日B 2
    #7 2020年10月8日B 1
    
    数据
    df1将
    日期
    列转换为实际日期对象,
    日期
    排列
    数据,并使用
    匹配
    唯一
    获得
    排名

    library(dplyr)
    
    df %>%
      mutate(Date = lubridate::mdy(Date)) %>%
      arrange(group, Date) %>%
      group_by(group) %>%
      mutate(rank = match(Date, unique(Date)))
    
    #  Date       group  rank
    #  <date>     <chr> <int>
    #1 2020-11-07 A         1
    #2 2020-11-07 A         1
    #3 2020-12-05 A         2
    #4 2020-12-05 A         2
    #5 2020-10-08 B         1
    #6 2020-11-09 B         2
    #7 2020-11-09 B         2
    
    库(dplyr)
    df%>%
    突变(日期=润滑::mdy(日期))%>%
    安排(组、日期)%>%
    分组依据(分组)%>%
    变异(等级=匹配(日期,唯一(日期)))
    #日期组等级
    #        
    #1 2020-11-07 A 1
    #2 2020-11-07 A 1
    #3 2020-12-05 A 2
    #4 2020-12-05 A 2
    #5 2020-10-08 B 1
    #6 2020-11-09 B 2
    #7 2020-11-09 B 2
    
    数据

    df <- structure(list(Date = c("12/5/2020", "12/5/2020", "11/7/2020", 
    "11/7/2020", "11/9/2020", "11/9/2020", "10/8/2020"), group = c("A", 
    "A", "A", "A", "B", "B", "B")), class = "data.frame", row.names = c(NA, -7L))
    

    df-Hi-Yusha。欢迎来到堆栈溢出。你能告诉我们为什么队伍是这样排列的吗?你的例子不太清楚。我的失败是没有先写最后的答案*耸耸肩*
    
    df <- structure(list(Date = c("12/5/2020", "12/5/2020", "11/7/2020", 
    "11/7/2020", "11/9/2020", "11/9/2020", "10/8/2020"), group = c("A", 
    "A", "A", "A", "B", "B", "B")), class = "data.frame", row.names = c(NA, -7L))