2016-07-27 7 views
0

data.tableに重複する行があります。いくつかの変数はリストです。重複する行を削除し、データテーブルを使用してグループごとに1行に集約します。

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) 

私は以下のように上記の1行にまとめたいと思います:

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てもらえますか?リストの 'unique 'はRの中では混乱しますが、' DT [、lapply(.SD、unique)] 'がそれを行うかもしれません。 – Frank

+0

@Frankそれは重複した行を結合しましたが、重複していない情報を1つの行に入れたかったのです。あなたのメソッドを使用して、第1行はそれ自身の行であり、それは複製ではなく、複製された行はそれ自身の行です。複製されていない行も含めるにはどうすればよいですか? – user3067851

答えて

1

これはかなり厄介ですが、私たちがuniquify前

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の例の特殊な場合には


unionReduceを使用した場合も、仕事に起こる:それは再現可能ですので

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

ええ、私は同じ答えを得ることを期待しています。後者が大量に働いていても、欠落値をテストするために 'paste(x)==" NA "'ではなく 'is.na(x)'を使うように、標準的なテスト方法です。ケース。 – Frank

関連する問題