【问题标题】:How do I remove duplicate values within a column throughout the dataset in R如何在 R 中的整个数据集中删除列中的重复值
【发布时间】:2021-07-10 00:26:35
【问题描述】:

数据框如下所示:

        var_1 var_2 var_3
        5     2     2
        5     2     1
        6     3     4

数据输入

data <- structure(list(var_1 = c(5L, 5L, 6L), var_2 = c(2L, 2L, 3L), 
  var_3 = c(2L, 1L, 4L)), row.names = c(NA, -3L), class = "data.frame")

如何删除列中的重复值,并对所有列重复此操作,以使数据看起来像:

       var_1 var_2 var_3
       5     2     2
       6     3     1
                   4

【问题讨论】:

  • 我假设您希望 NA 在那里而不是转换为字符以具有空白字符串“”?
  • 感谢乔恩的回复。北美会工作。最终,我想对每一列求和,所以如果这是最简单的方法,那么使用 NA 就可以了。

标签: r duplicates unique columnsorting


【解决方案1】:

这是一种方法,旋转时间更长,过滤不同的列值组合,然后展开:

library(tidyverse)
df %>%
  pivot_longer(cols = everything()) %>%
  distinct(name, value) %>%
  group_by(name) %>%
  mutate(row = row_number()) %>%
  ungroup() %>%
  pivot_wider(names_from = name, values_from = value)

结果

# A tibble: 3 x 4
    row var_1 var_2 var_3
  <int> <int> <int> <int>
1     1     5     2     2
2     2     6     3     1
3     3    NA    NA     4

如果你想要不同数字的总和,你可以在最后一行添加:

%>% summarize(across(-row, ~sum(., na.rm = TRUE)))

结果:

# A tibble: 1 x 3
  var_1 var_2 var_3
  <int> <int> <int>
1    11     5     7

【讨论】:

  • 太棒了,谢谢!如果我想总结 50 个变量列而不是 3 我如何将第 1 列添加到第 50 列,然后写出一个 csv 文件?谢谢
  • 已编辑,您可以使用-row 来表征您不想汇总的行,或者先使用select(-row) %&gt;% summarize(across(everything(), ~sum... 将其过滤掉
  • 我试过 %>%summarize(across(everything(), ~sum(., na.rm = TRUE))) 但它似乎不起作用。或者,如何在您的代码行 pivot_wider(names_from = name, values_from = value) 之后写出 csv 文件?
  • 编辑后的%&gt;% summarize(across(-row, ~sum(., na.rm = TRUE))) 有效吗?如果要导出,请参阅 write_csv 或者您可以尝试 clipr::write_clip 粘贴到其他内容中。
【解决方案2】:

尝试在唯一后返回不同长度的列表。在data.frame 中,您总是需要它们具有相同的长度并填写NA

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(purrr)
data <- structure(list(var_1 = c(5L, 5L, 6L), var_2 = c(2L, 2L, 3L), 
  var_3 = c(2L, 1L, 4L)), row.names = c(NA, -3L), class = "data.frame")

# get unique lsit
map(data, unique)
#> $var_1
#> [1] 5 6
#> 
#> $var_2
#> [1] 2 3
#> 
#> $var_3
#> [1] 2 1 4

# get unique & sum in one take
map(data, function(x) { sum(unique(x)) })
#> $var_1
#> [1] 11
#> 
#> $var_2
#> [1] 5
#> 
#> $var_3
#> [1] 7

如果只需要计算唯一值的总和,则带有汇总的较短版本

# if all you need is the sum of unique value then you can just do this
data %>%
  summarize(across(.fns = function(x) { sum(unique(x)) }))
#>   var_1 var_2 var_3
#> 1    11     5     7

reprex package (v2.0.0) 于 2021 年 4 月 15 日创建reprex package (v2.0.0) 于 2021 年 4 月 15 日创建

【讨论】:

    【解决方案3】:

    基础

    data <- structure(list(var_1 = c(5L, 5L, 6L), var_2 = c(2L, 2L, 3L), 
                           var_3 = c(2L, 1L, 4L)), row.names = c(NA, -3L), class = "data.frame")
    
    
    
    
    tmp <- sapply(data, unique)
    
    res <- sapply(tmp, "length<-", max(lengths(tmp)))
    res
    #>      var_1 var_2 var_3
    #> [1,]     5     2     2
    #> [2,]     6     3     1
    #> [3,]    NA    NA     4
    colSums(res, na.rm = T)
    #> var_1 var_2 var_3 
    #>    11     5     7
    

    reprex package (v2.0.0) 于 2021-04-15 创建

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 2012-11-13
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 2023-03-21
      • 2020-02-16
      • 2018-01-26
      相关资源
      最近更新 更多