2016-07-27 49 views
0

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

有人问我dput数据,我希望这不是吗?

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)) 
+0

你能dput为例所以它的重现?列表中的“独特”在R中是一团糟,但是'DT [,lapply(.SD,unique)]'可能会做到。 – Frank

+0

@Frank它结合了重复的行,但我也想在一行上的非重复信息。使用你的方法,第一行是它自己的行,因为它不是重复的,重复的行是它自己的行。我如何也包含不重复的行? – user3067851

回答

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我们uniquify之前。


在OP的例子的特殊情况下,使用Reduceunion也正好工作:

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

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

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

+0

正确的测试可能是'is.null'不与字符串“NULL”相比较 – Frank

+0

@Frank'is.null'和'!=“NULL”'在这种情况下给出了相同的答案。我不确定但这可能成为另一种做法。 R的灵活性。 – PPC

+0

是的,我期望它得到相同的答案。我想我的意思是这是测试的规范方式,就像你会使用'is.na(x)'而不是'paste(x)==“NA”'来测试缺失值,即使后者在很多情况下工作案例。 – Frank