在r中编码为a-b,b-a到a-b的因子

时间:2018-01-04 16:57:51

标签: r

我正在处理一些编码为a-b的因素,有些则编码为b-a。两者都保存为我的用例。如何将这些因素更改为a-b以使它们保持一致。

我可以使用if-else语句执行此操作,但我想知道是否有一种有效的方法。

 Id        Col1
 101       a-b-c-d
 102       a-c-d
 103       a-b
 104       a-b
 105       b-a
 106       b-a
 107       a-c-b

预期结果

 Id        Col1
 101       a-b-c-d
 102       a-c-d
 103       a-b
 104       a-b
 105       a-b
 106       a-b
 107       a-c-b

3 个答案:

答案 0 :(得分:1)

separate_rows

之后,我们可以使用paste将“Col1”拆分为sort
library(dplyr)
library(tidyr)
df1 %>% 
   separate_rows(Col1) %>% 
   group_by(Id) %>% 
   summarise(Col1 = paste(sort(Col1), collapse='-'))

答案 1 :(得分:1)

代码可能性稍差,但使用基本功能

df1$Col2 <- factor(sapply(as.character(df1$Col1), function(x) paste(sort(unlist(strsplit(x, "-"))), collapse = "-")))

> df1
   Id    Col1    Col2
1 101 a-b-c-d a-b-c-d
2 102   a-c-d   a-c-d
3 103     a-b     a-b
4 104     a-b     a-b
5 105     b-a     a-b
6 106     b-a     a-b
7 107   a-c-b   a-b-c

答案 2 :(得分:1)

您可以使用src

Col1置换到位
levels<-

或使用df <- data.frame(Id = 101:107, Col1 = c("a-b-c-d", "a-c-d", "a-b", "a-b", "b-a", "b-a", "a-c-b")) levels(df$Col1) <- sapply(strsplit(levels(df$Col1), '-'), function(x) paste(sort(x), collapse = '-')) df #> Id Col1 #> 1 101 a-b-c-d #> 2 102 a-c-d #> 3 103 a-b #> 4 104 a-b #> 5 105 a-b #> 6 106 a-b #> 7 107 a-b-c forcats::fct_relabel

lvls_revalue