删除重复的行,然后使用datatable按组聚合到一行

时间:2016-07-27 17:37:40

标签: r data.table unique aggregate

我在data.table中有重复的行 - 见下文。一些变量是列表。

ID  l29 s14 s2  s7  s71 s91
12345   NULL    3   NULL    NULL    NULL    NULL
12345   NULL    NULL    1   NULL    NULL    NULL
12345   NULL    NULL    NULL    2   NULL    NULL
12345   NULL    NULL    NULL    NULL    c(4.5, 8, 9, 10)    NULL
12345   NULL    NULL    NULL    NULL    c(4.5, 8, 9, 10)    NULL
12345   NULL    NULL    NULL    NULL    c(4.5, 8, 9, 10)    NULL
12345   NULL    NULL    NULL    NULL    NULL    c(6, 7)
12345   11  NULL    NULL    NULL    NULL    NULL
12345   NULL    NULL    NULL    NULL    c(4.5, 8, 9, 10)    NULL
12345   NULL    NULL    NULL    NULL    NULL    c(6, 7)

我想将上述内容总结为如下所示:

12345   11  3   1   2   c(4.5, 8, 9, 10)    c(6, 7)

有人让我输入数据,我希望这样做吗?

structure(list(SSN_TAX_ID = c("12345", "12345", "12345", "12345", 
"12345", "12345", "12345", "12345", "12345", "12345"), L29 = list(
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 11, NULL, NULL), 
    S14 = list(3, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
        NULL), S2 = list(NULL, 1, NULL, NULL, NULL, NULL, NULL, 
        NULL, NULL, NULL), S7 = list(NULL, NULL, 2, NULL, NULL, 
        NULL, NULL, NULL, NULL, NULL), S71 = list(NULL, NULL, 
        NULL, c(4.5, 8, 9, 10), c(4.5, 8, 9, 10), c(4.5, 8, 9, 
        10), NULL, NULL, c(4.5, 8, 9, 10), NULL), S91 = list(
        NULL, NULL, NULL, NULL, NULL, NULL, c(6, 7), NULL, NULL, 
        c(6, 7))), .Names = c("SSN_TAX_ID", "L29", "S14", "S2", 
"S7", "S71", "S91"), class = "data.frame", row.names = c(NA, 
-10L))

2 个答案:

答案 0 :(得分:1)

这非常混乱,但是:

setDT(DT) # since the OP posted a data frame
DT[, lapply(.SD, function(x) unique(Filter(Negate(is.null), x)))]
#    SSN_TAX_ID L29 S14 S2 S7                 S71 S91
# 1:      12345  11   3  1  2  4.5, 8.0, 9.0,10.0 6,7
在我们统一之前,

Filter(Negate(is.null), x)从每列中删除NULL。

在OP的示例的特殊情况下,将Reduceunion一起使用也会起作用:

DT[, lapply(.SD, function(x) .(Reduce(union, x)))]

答案 1 :(得分:0)

您可以使用apply函数从每列中选择唯一记录,然后从中删除NULL值。

df<-apply(df,2,unique) df<-unlist(df) df<-df[df!="NULL"]