【问题标题】:List of data frames with the same number of variables and delete duplicates inside one variable and do the same in the rest of the data frames具有相同数量变量的数据框列表,并删除一个变量内的重复项,并在其余数据框中执行相同操作
【发布时间】:2021-08-03 15:06:18
【问题描述】:

我有以下数据框列表,每个数据框有 3 个变量(a、b 和 c)

my.list <- list(d1, d2, d3, d4)

在我的数据框中,我在“a”中有重复的字符串,我想删除具有重复值的行

我正在使用的当前代码:

my.listnew <- lapply(my.list, function(x) unique(x["a"]))

这段代码的问题是其他 2 列“b”和“c”已经消失,我想保留它们,而重复的行被删除

【问题讨论】:

    标签: r list function lapply nested-datalist


    【解决方案1】:

    使用duplicated 删除列a 中的重复值,同时保留其他列。

    my.listnew <- lapply(my.list, function(x) x[!duplicated(x$a), ])
    

    【讨论】:

      【解决方案2】:

      仅供参考,tidyverse的做法-

      set.seed(1)
      my.list <- list(d1 = data.frame(a = sample(letters[1:3], 5, T),
                                      b = rnorm(5),
                                      c = rnorm(5)), 
                      d2 = data.frame(a = sample(letters[1:3], 5, T),
                                      b = rnorm(5),
                                      c = rnorm(5)), 
                      d3 = data.frame(a = sample(letters[1:3], 5, T),
                                      b = rnorm(5),
                                      c = rnorm(5)))
      library(tidyverse)
      map(my.list, ~ .x %>% filter(!duplicated(a)) )
      #> $d1
      #>   a         b          c
      #> 1 a 1.5952808  0.5757814
      #> 2 c 0.3295078 -0.3053884
      #> 3 b 0.4874291  0.3898432
      #> 
      #> $d2
      #>   a          b         c
      #> 1 b  0.2522234 0.3773956
      #> 2 a -0.8919211 0.1333364
      #> 
      #> $d3
      #>   a          b          c
      #> 1 a -0.2357066  1.1519118
      #> 2 c -0.4333103 -0.4295131
      #> 3 b -0.6494716  1.2383041
      

      reprex package (v2.0.0) 于 2021-05-13 创建

      如果您还想在输出中组合数据帧,您可以使用map_dfr 而不是上面的map

      【讨论】:

      • 或者只是map(my.list, ~distinct(.x, a))
      • 没有@dash2,它只在输出中给出a
      • 嗯,好的。 map(my.list, ~distinct(.x, a, .keep_all = TRUE)) 然后。
      • @dash2 感谢您的增值。我不知道这个.keep_all 论点。 :)
      【解决方案3】:

      我们可以在没有任何匿名函数的情况下使用subset

      out <- lapply(my.list, subset, subset = !duplicated(a))
      

      或者使用data.tableunique

      library(data.table)
      out <- lapply(my.list, function(dat) unique(as.data.table(dat), by = 'a'))
      

      【讨论】:

        猜你喜欢
        • 2015-11-05
        • 1970-01-01
        • 1970-01-01
        • 2015-07-25
        • 2020-07-20
        • 2021-02-22
        • 1970-01-01
        • 1970-01-01
        • 2021-09-29
        相关资源
        最近更新 更多