【问题标题】:remove duplicate rows then aggregate into one row by group using datatable删除重复行,然后使用数据表按组聚合成一行
【发布时间】:2016-07-27 17:37:40
【问题描述】:

我在 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))

【问题讨论】:

  • 你能举个例子让它重现吗?列表中的unique 在 R 中有点乱,但 DT[,lapply(.SD, unique)] 可能会这样做。
  • @Frank 它结合了重复的行,但我也想要一行上的非重复信息。使用您的方法,第一行是它自己的行,因为它不是重复的,并且重复的行是它自己的行。如何还包括不重复的行?

标签: r data.table unique aggregate


【解决方案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)))]

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 正确的测试可能是is.null 不与字符串“NULL”进行比较
    • @Frank is.null!="NULL" 在这种情况下给出了相同的答案。我不确定,但这可能是另一种方式。 R的灵活性。
    • 是的,我希望它得到相同的答案。我想我的意思是这是测试的规范方法,就像你会使用 is.na(x) 而不是 paste(x) == "NA" 来测试缺失值,即使后者在很多情况下都有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多