【问题标题】:For each item of a list only keep the unique strings对于列表的每个项目,只保留唯一的字符串
【发布时间】:2021-12-18 13:32:07
【问题描述】:

我有如下示例数据:

df_list = list()

df_list[[1]] <- c("A", NA, "A", "Ab", "Ac", NA, NA, "AA")
df_list[[2]] <- c(NA, "A", NA, NA, "AA", NA)
df_list[[3]] <- c("AA", "Ac", "Ad", NA, NA, NA, "Af", NA)
df_list[[4]] <- c(NA, NA, "AA", "Ac", "Ad", "AA", NA)
df_list[[5]] <- c(NA, "Ae", NA, "Ad", "Af", NA, "AA", NA)

names(df_list)[1] <- "nr1"
names(df_list)[2] <- "nr2"
names(df_list)[3] <- "nr3"
names(df_list)[4] <- "nr4"
names(df_list)[5] <- "nr5"

df 看起来像这样(注意不同的长度):

# A tibble: 8 x 5
  nr1   nr2   nr3   nr4   nr5  
  <chr> <chr> <chr> <chr> <chr>
1 A     NA    AA    NA    NA   
2 NA    A     Ac    NA    Ae   
3 A     NA    Ad    AA    NA   
4 Ab    NA    NA    Ac    Ad   
5 Ac    AA    NA    Ad    Af   
6 NA    NA    NA    AA    NA   
7 NA          Af    NA    AA   
8 AA          NA          NA 

对于每个列表项,我只想保留唯一的字符串。

我一直在思考如何做到这一点,但我不知道该怎么做。

想要的输出(df 形式):

# A tibble: 8 x 5
  nr1   nr2   nr3   nr4   nr5  
  <chr> <chr> <chr> <chr> <chr>
1 A     A     AA    AA    Ae   
2 Ab    AA    Ac    Ac    Ad   
3 Ac          Ad    Ad    Af   
4 AA          Af          AA                 

列表形式:

df_list = list()
df_list[[1]] <- c("A", "Ab", "Ac", "AA")
df_list[[2]] <- c("A","AA")
df_list[[3]] <- c("AA", "Ac", "Ad","Af")
df_list[[4]] <- c("AA", "Ac", "Ad")
df_list[[5]] <- c("Ae", "Ad", "Af", "AA")
names(df_list)[1] <- "nr1"
names(df_list)[2] <- "nr2"
names(df_list)[3] <- "nr3"
names(df_list)[4] <- "nr4"
names(df_list)[5] <- "nr5"

【问题讨论】:

  • 也许是这个? lapply(df_list,unique)?或者这个(没有 NA):lapply(df_list,function(x) unique(na.omit(x)))?
  • 谢谢!我在发帖后两分钟就想通了(我想我需要再来一杯咖啡)。但是没有NA 的版本真的很不错。非常感谢。
  • @rmf 请作为答案发布。
  • @Tom 这里有很多很好的答案。请选择一个适合你的。
  • @rmf 我实际上应用了您的答案,所以我在等待您是否将其作为答案发布。我还没有测试其他人,但会尽快。

标签: r list unique


【解决方案1】:

解决方案

tmp=lapply(df_list,function(x){unique(na.omit(x))})
asd=max(unlist(lapply(tmp,length)))
do.call(cbind,lapply(tmp,function(x){length(x)=asd;x}))

     nr1  nr2  nr3  nr4  nr5 
[1,] "A"  "A"  "AA" "AA" "Ae"
[2,] "Ab" "AA" "Ac" "Ac" "Ad"
[3,] "Ac" NA   "Ad" "Ad" "Af"
[4,] "AA" NA   "Af" NA   "AA"

【讨论】:

    【解决方案2】:

    这是purrr 解决方案

    library(purrr)
    df_list %>%
        map(~ unique(.x[!is.na(.x)])) %>%
        map_dfc(., function(w) replace(character(max(lengths(.))), 1:length(w), w))
    ## A tibble: 4 x 5
    #  nr1   nr2   nr3   nr4   nr5
    #  <chr> <chr> <chr> <chr> <chr>
    #1 A     "A"   AA    "AA"  Ae
    #2 Ab    "AA"  Ac    "Ac"  Ad
    #3 Ac    ""    Ad    "Ad"  Af
    #4 AA    ""    Af    ""    AA
    

    我们的想法是首先删除所有 NA 和重复条目,然后我们将所有填充的 list 元素列绑定到 tibble 中。您可以将其缩短为一个 map_dfc 调用,但此版本有助于提高可读性。

    【讨论】:

      【解决方案3】:

      我们可以使用purrr::map、discard、is.na 和unique。

      回答

      library(purrr)
      
      df_list %>% map(discard, is.na)%>%
                  map(unique)
      

      输出

      $nr1
      [1] "A"  "Ab" "Ac" "AA"
      
      $nr2
      [1] "A"  "AA"
      
      $nr3
      [1] "AA" "Ac" "Ad" "Af"
      
      $nr4
      [1] "AA" "Ac" "Ad"
      
      $nr5
      [1] "Ae" "Ad" "Af" "AA"
      

      【讨论】:

        【解决方案4】:
        l <- sapply(df_list, function(x) unique(na.omit(x)))
        
        sapply(l, function(x) {length(x) <- max(lengths(l)); x}) %>% 
          as_tibble()
        
        # A tibble: 4 x 5
          nr1   nr2   nr3   nr4   nr5  
          <chr> <chr> <chr> <chr> <chr>
        1 A     A     AA    AA    Ae   
        2 Ab    AA    Ac    Ac    Ad   
        3 Ac    NA    Ad    Ad    Af   
        4 AA    NA    Af    NA    AA 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-03-17
          • 1970-01-01
          • 2014-10-17
          • 1970-01-01
          • 1970-01-01
          • 2016-02-18
          • 2021-06-14
          相关资源
          最近更新 更多