我需要为每行的某些列排序值,但前提是同一行的某些其他引用列具有相同的值(跳过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有很多行。
答案 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
值排序(暂时转换为字符,因为无法按列表分组)然后我一直爬到初始格式。