【问题标题】:How to remove duplicated characters from each rows of a column?如何从列的每一行中删除重复字符?
【发布时间】:2019-10-24 01:31:58
【问题描述】:

如何使用 R 从列的字符串中删除重复字符? 例如,这是我的专栏:

df<- data.frame(name = c(A="a,a,b,c,d,d,d",
                            B="a,b,b,b,f",
                            C="d,d,d,d",
                            D="a,a"))

我预期的专栏:

df<- data.frame(name = c(A="a,b,c,d",
                            B="a,b,f",
                            C="d",
                            D="a"))

【问题讨论】:

标签: r dataframe duplicates


【解决方案1】:

使用tidyverse,我们可以首先将行名添加为列,将逗号分隔的字符串分隔为separate_rowsgroup_byrowname,然后删除duplicated值并再次使用toString将它们转换为逗号分隔的字符串。

library(tidyverse)

df %>%
  rownames_to_column() %>%
  separate_rows(name, sep = ",") %>%
  group_by(rowname) %>%
  filter(!duplicated(name)) %>%
  summarise(name = toString(name)) %>%
  column_to_rownames()

#        name
#A a, b, c, d
#B    a, b, f
#C          d
#D          a

使用sapply 的Base R 方法,与@tmfmnk 完全相同

sapply(strsplit(as.character(df$name), ","), function(x) toString(unique(x)))
#[1] "a, b, c, d" "a, b, f"    "d"          "a" 

【讨论】:

    【解决方案2】:

    dplyr 的一种可能是:

    df %>%
     rowwise() %>%
     mutate(name = toString(unique(unlist(strsplit(name, ",")))))
    
      name      
      <chr>     
    1 a, b, c, d
    2 a, b, f   
    3 d         
    4 a 
    

    base R:

    sapply(df$name, function(x) toString(unique(unlist(strsplit(x, ",")))), USE.NAMES = FALSE)
    

    【讨论】:

      【解决方案3】:

      mapstrsplit 的选项

      library(tidyverse)
      df %>%
         mutate(name = strsplit(as.character(name), ",") %>% 
         map(~toString(unique(.x))))
      #        name
      #1 a, b, c, d
      #2    a, b, f
      #3          d
      #4          a
      

      或在base R 中使用正则表达式

      sub(",$", "", gsub("([a-z],)\\1+", "\\1", paste0(df$name, ",")))
      #[1] "a,b,c,d" "a,b,f"   "d"       "a" 
      

      【讨论】:

        猜你喜欢
        • 2023-02-02
        • 1970-01-01
        • 2023-03-17
        • 2021-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-18
        • 2022-12-18
        相关资源
        最近更新 更多