如何在 R 中的整个数据集中删除列中的重复值

How do I remove duplicate values within a column throughout the dataset in R

数据框如下所示:

        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

尝试 return unique 后长度不同的列表。在 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-04-15 创建 reprex package (v2.0.0)

于 2021-04-15 创建

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

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

基础

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 创建