如何使用`dplyr`包删除group_by()之后每列的重复重复

时间:2015-08-15 02:07:22

标签: r dataframe dplyr data-manipulation

我有像这样的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包执行此操作的有效方法吗?非常感谢你。

2 个答案:

答案 0 :(得分:3)

使用基数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

答案 1 :(得分:2)

我们可以使用dplyr/tidyr。我们重塑了“广泛”的数据。长期&#39;使用gather,删除&#39; Val&#39;中的空白元素。使用filter的列,并将其重新整理为广泛的&#39;格式为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的另一种方法(如果非空白值的数量在每个组中相同)将按照&#39; V1&#39;&#39; V2&#39进行分组;并使用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来执行此操作。我们转换了&#39; data.frame&#39;到&#39; data.table&#39; (setDT(mydata)),按&#39; V1&#39;&#39; V2&#39;分组,我们遍历其他列(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

使用aggregatebase R的类似方法

 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"))