【问题标题】:how to delete one of two duplicates in each column and merge them in r如何删除每列中的两个重复项之一并将它们合并到 r
【发布时间】:2021-08-17 01:03:22
【问题描述】:

我有一个数据,它由两列和这些列上的一些重复项组成。我想删除每列的重复项,然后收集所有保留列名的唯一值。

 data<-structure(c(10L, 10L, 11L, 11L, 5L, 5L, 3L, 5L), .Dim = c(2L, 
4L), .Dimnames = list(c("d1", "m1"), c("year2036", "year2037", 
"year2038", "year2039")))

   year2036 year2037 year2038 year2039
d1       10       11        5        3
m1       10       11        5        5

输出会是这样的:

year2036 year2037 year2038 year2039 year2039 
      10       11        5        3        5 

out<-structure(c(10, 11, 5, 3, 5), .Names = c("year2036", "year2037", 
"year2038", "year2039", "year2039"))

我尝试了unique(r[c(1:8)]),但它只是给出了删除列名的唯一数字。

【问题讨论】:

  • 您想要的输出不是“好”的输出。具有重复名称的向量在技术上是 R 允许的,但它是模棱两可的,不应在任何地方使用。在您的示例中考虑 out['year2039'] 。它只返回3。如果你想参考 5 怎么办?所以不应该使用你想要的输出!
  • 跟进@Julian_Hn 的评论,我建议您使用pivot_longer 来处理这种格式的数据。
  • @Julian_Hn 是的,我同意你关于错误数据类型的观点,但我的观点是为每个元素执行函数。该函数将应用于 year2039[5] 和 year2039[3]。因此,我想不出任何其他解决方案。

标签: r duplicates


【解决方案1】:

您可以在applystack 结果中使用unique

stack(apply(data, 2, unique))
#  values      ind
#1     10 year2036
#2     11 year2037
#3      5 year2038
#4      3 year2039
#5      5 year2039

或者你想要的格式:

x <- stack(apply(data, 2, unique))
setNames(x$values, x$ind)
#year2036 year2037 year2038 year2039 year2039 
#      10       11        5        3        5 

【讨论】:

    【解决方案2】:
    data %>%
        as_tibble() %>%
        pivot_longer(everything()) %>%
        group_by(name) %>%
        distinct(value)
    
     # A tibble: 5 x 2
     # Groups:   name [4]
       name     value
       <chr>    <int>
     1 year2036    10
     2 year2037    11
     3 year2038     5
     4 year2039     3
     5 year2039     5
    

    【讨论】:

      【解决方案3】:

      让数据具有相同的列名不是一个好习惯。这是一个解决方案,其结构与您的预期输出相同,但经过修改 列名。

      library(dplyr)
      library(tidyr)
      
      data %>%
        as.data.frame() %>%
        pivot_longer(cols = everything()) %>%
        distinct() %>%
        mutate(row = data.table::rowid(name)) %>%
        pivot_wider(names_from = c(name, row), values_from = value)
      
      #  year2036_1 year2037_1 year2038_1 year2039_1 year2039_2
      #       <int>      <int>      <int>      <int>      <int>
      #1         10         11          5          3          5 
      

      【讨论】:

        【解决方案4】:

        使用来自collapsedapply

        library(collapse)
        stack(dapply(data, MARGIN = 2, FUN = funique))
          values      ind
        1     10 year2036
        2     11 year2037
        3      5 year2038
        4      3 year2039
        5      5     <NA>
        

        【讨论】:

          猜你喜欢
          • 2017-06-05
          • 2015-02-18
          • 1970-01-01
          • 2020-03-21
          • 2015-11-29
          • 1970-01-01
          • 2018-06-09
          • 1970-01-01
          • 2021-11-20
          相关资源
          最近更新 更多