【问题标题】:factors coded as a-b, b-a, to a-b in r编码为 a-b, b-a, to a-b in r 的因子
【发布时间】:2018-01-05 01:36:09
【问题描述】:

我正在处理一些编码为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

【问题讨论】:

  • 你有a-c-b-d之类的案例吗?如果是一般情况,那么library(dplyr); df1 %>% separate_rows(Col1) %>% group_by(Id) %>% summarise(Col1 = paste(sort(Col1), collapse='-'))
  • @akrun,是的,我还有其他因素
  • 例如在上述情况下,您拥有a-c-b。应该是a-b-c 吗?
  • @akrun,是的。没错

标签: r


【解决方案1】:

我们可以在sorting 之后使用separate_rows 拆分'Col1',然后paste 将其合并

library(dplyr)
library(tidyr)
df1 %>% 
   separate_rows(Col1) %>% 
   group_by(Id) %>% 
   summarise(Col1 = paste(sort(Col1), collapse='-'))

【讨论】:

    【解决方案2】:

    代码可能不太可读,但使用了基本函数

    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
    

    【讨论】:

      【解决方案3】:

      您可以使用levels&lt;- 就地升级Col1

      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_relabellvls_revalue

      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"))
      
      forcats::fct_relabel(df$Col1, 
                           function(levs){
                               sapply(strsplit(levs, '-'), 
                                      function(lev) paste(sort(lev), collapse = '-'))
                           })
      #> [1] a-b-c-d a-c-d   a-b     a-b     a-b     a-b     a-b-c  
      #> Levels: a-b a-b-c-d a-b-c a-c-d
      
      forcats::lvls_revalue(df$Col1, 
                            sapply(strsplit(levels(df$Col1), '-'), 
                                   function(x){paste(sort(x), collapse = '-')}))
      #> [1] a-b-c-d a-c-d   a-b     a-b     a-b     a-b     a-b-c  
      #> Levels: a-b a-b-c-d a-b-c a-c-d
      

      【讨论】:

        猜你喜欢
        • 2014-03-29
        • 1970-01-01
        • 2021-10-06
        • 1970-01-01
        • 2021-11-28
        • 2012-03-18
        • 2018-01-29
        • 2010-12-08
        • 1970-01-01
        相关资源
        最近更新 更多