【问题标题】:how to delete duplicated duplicated of each column after group_by() using `dplyr` package如何使用`dplyr`包在group_by()之后删除每列的重复项
【发布时间】:2015-11-08 08:15:44
【问题描述】:

我有一个这样的data.frame mydata

   V1 V2 V3 V4 V5
1  a  b  a      
2  a  b     c   
3  a  b        d
4  x  y  h      
5  x  y     k  e

我想按V1V2列分组,并删除其他列中的""字符串

结果应该是这样的

  V1 V2 V3 V4 V5
1  a  b  a  c  d
2  x  y  h  k  e

他们是使用dplyr 包执行此操作的有效方法吗?非常感谢。

【问题讨论】:

    标签: r dataframe dplyr data-manipulation


    【解决方案1】:

    如果感兴趣的话,使用base R

    x <- data.frame(V1 = c(rep("a", 3), "x", "x"), 
        V2 = c(rep("b", 3), "y", "y"), 
        V3= c("a", "", "", "h", ""), 
        V4 = c("", "c", "", "", "k"), 
        V5 = c(rep("", 2), "d", "", "e"))
    
    temp <- lapply(x[], function(y) as.character(unique(y[y != ""])))
    data.frame(do.call(cbind,temp))
    
      V1 V2 V3 V4 V5
    1  a  b  a  c  d
    2  x  y  h  k  e
    

    【讨论】:

    • 几个stringsAsFactors=FALSE 参数也可以很方便地包含在内。
    • 听起来是个好主意。你能详细说明一下吗?我不确定我是否完全遵循
    【解决方案2】:

    我们可以使用dplyr/tidyr。我们使用gather将数据从“宽”重塑为“长”,使用filter删除“Val”列中的空白元素,并使用spread将其重塑回“宽”格式。

    library(dplyr)
    library(tidyr) 
    gather(mydata, Var, Val, V3:V5) %>% 
                  filter(Val!='') %>% 
                  spread(Var, Val)
    #   V1 V2 V3 V4 V5
    #1  a  b  a  c  d
    #2  x  y  h  k  e
    

    或仅使用dplyr 的另一种方法(如果每个组中非空白值的数量相同)将按“V1”、“V2”分组,并使用summarise_each 仅选择元素非空白 (.[.!=''])

     mydata %>%
           group_by(V1, V2) %>% 
           summarise_each(funs(.[.!='']))
     #  V1 V2 V3 V4 V5
     #1  a  b  a  c  d
     #2  x  y  h  k  e
    

    我们也可以使用data.table 来执行此操作。我们将“data.frame”转换为“data.table”(setDT(mydata)),按“V1”、“V2”分组,遍历其他列(lapply(.SD, ...))并对非空白元素进行子集化。

     library(data.table)
     setDT(mydata)[,lapply(.SD, function(x) x[x!='']) ,.(V1, V2)]
     #   V1 V2 V3 V4 V5
     #1:  a  b  a  c  d
     #2:  x  y  h  k  e
    

    使用来自base Raggregate 的类似方法是

     aggregate(.~V1+V2, mydata, FUN=function(x) x[x!=''])
     #  V1 V2 V3 V4 V5
     #1  a  b  a  c  d
     #2  x  y  h  k  e
    

    数据

    mydata <- structure(list(V1 = c("a", "a", "a", "x", "x"),
    V2 = c("b", "b", 
    "b", "y", "y"), V3 = c("a", "", "", "h", ""), V4 = c("", "c", 
    "", "", "k"), V5 = c("", "", "d", "", "e")), .Names = c("V1", 
    "V2", "V3", "V4", "V5"), class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5"))
    

    【讨论】:

    • @ZihuGuo 很高兴为您提供帮助。
    猜你喜欢
    • 2020-08-20
    • 2023-03-09
    • 2019-11-22
    • 2018-04-07
    • 1970-01-01
    • 2019-05-31
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多