行内排序(有条件)

时间:2018-02-13 17:29:22

标签: r data.table

我需要为每行的某些列排序值,但前提是同一行的某些其他引用列具有相同的值(跳过NA和NULL)。列具有不同的类型(要排序为字符,引用是列表)。

以下MWE。不应排序第2行。 DT.is是要使用的data.table,DT.want就是所需要的。

library(data.table)
DT.is <- data.table(Col_A=c("V2", "V2", "V2", "V2"),
                                 Col_B=c("V3", "V3", "V1", "V1"),
                                 Col_C=c("V1", "V1", NA_character_, NA_character_),
                                 Ref_A=list(c("RA", "RB"), "RB", "RA", "RA"),
                                 Ref_B=list(c("RA", "RB"), c("RA", "RB"), "RA", "RA"),
                                 Ref_C=list(c("RA", "RB"), "RA", NULL, NA_character_))

DT.want <- data.table(Col_A=c("V1", "V2", "V1", "V1"),
                                        Col_B=c("V2", "V3", "V2", "V2"),
                                        Col_C=c("V3", "V1", NA_character_, NA_character_),
                                        Ref_A=list(c("RA", "RB"), "RB", "RA", "RA"),
                                        Ref_B=list(c("RA", "RB"), c("RA", "RB"), "RA", "RA"),
                                        Ref_C=list(c("RA", "RB"), "RA", NULL, NA_character_))

原始data.table有很多行。

1 个答案:

答案 0 :(得分:1)

这是一个很好的旅程:):

我不知道如何使用data.table这样做,所以这是一个tidyverse解决方案:

library(tidyverse)
DT.is %>%
  rownames_to_column %>%
  gather(key,value,-1) %>%
  separate(key,c("type","V")) %>%
  spread(type,value) %>%
  mutate(Ref2=as.character(Ref),
         Col = unlist(Col)) %>%
  group_by(rowname,Ref2) %>%
  mutate(Col = sort(Col,na.last=TRUE)) %>%
  ungroup %>%
  select(-Ref2) %>%
  gather(type,value,Col,Ref) %>%
  unite(key,type,V) %>%
  spread(key,value) %>%
  as.data.table

#    rowname Col_A Col_B Col_C Ref_A Ref_B Ref_C
# 1:       1    V1    V2    V3 RA,RB RA,RB RA,RB
# 2:       2    V2    V3    V1    RB RA,RB    RA
# 3:       3    V1    V2    NA    RA    RA  NULL
# 4:       4    V1    V2    NA    RA    RA    NA

我首先转换为长格式,因为这样我就可以按您的Ref值进行分组。然后我按初始行id和Ref值排序(暂时转换为字符,因为无法按列表分组)然后我一直爬到初始格式。