2016-03-26 5 views
2

私はdata.table datを4列、たとえば(col1,col2,,)持っています。data.tableに行を追加しますが、特定の列が同じ値をとる場合は使用しないでください。

入力データ:

structure(list(col1 = c(5.1, 5.1, 4.7, 4.6, 5, 5.1, 5.1, 4.7, 
4.6, 5), col2 = c(3.5, 3.5, 3.2, 3.1, 3.6, 3.5, 3.5, 3.2, 3.1, 
3.6), col3 = c(1.4, 1.4, 1.3, 1.5, 1.4, 3.4, 3.4, 1.3, 1.5, 1.4 
), col4 = structure(c(1L, 1L, 1L, 1L, 1L, 4L, 4L, 4L, 4L, 4L), .Label = c("setosa", 
"versicolor", "virginica", "eer"), class = "factor")), .Names = c("col1", 
"col2", "col3", "col4"), row.names = c(NA, -10L), class = c("data.table", 
"data.frame")) 

r 
    col1 col2 col3 col4 
1: 5.1 3.5 1.4 setosa 
2: 5.1 3.5 1.4 setosa 
3: 4.7 3.2 1.3 setosa 
4: 4.6 3.1 1.5 setosa 
5: 5.0 3.6 1.4 setosa 
6: 5.1 3.5 3.4 eer 
7: 5.1 3.5 3.4 eer 
8: 4.7 3.2 1.3 eer 
9: 4.6 3.1 1.5 eer 
10: 5.0 3.6 1.4 eer 

私は追加することによって得た値を使用して新しい列r_newを作成しているsytnaxの上、

のでcol4

dat[ , r_new:= sum(col3, na.rm = T), .(col4)] #syntax 1 
の一意の各値のために col3上で以下の操作を行っております col3の値は col4と同じです。したがって、 col4の各一意の値は、列 r_newにユニークな値を持ちます。私は今、何をしたいか

、ないはcol1col2はこれが何をするかと同じ値(下記のようなもの)

dat[col1 is different OR col2 is different , r_new:= sum(col3, na.rm = T), .(col4)] 

を取っているそれらの行が含まれる上記と同じですが、を行うことです行に対してsumの機能を実行している間は、col1col2の両方が同じ値をとる行は含まれません。

この条件を1と同じ構文で含めるにはどうすればよいですか?

col1 col2 col3 col4 r_new 
1: 5.1 3.5 1.4 setosa 5.6 
2: 5.1 3.5 1.4 setosa 5.6 
3: 4.7 3.2 1.3 setosa 5.6 
4: 4.6 3.1 1.5 setosa 5.6 
5: 5.0 3.6 1.4 setosa 5.6 
6: 5.1 3.5 3.4 eer 7.6 
7: 5.1 3.5 3.4 eer 7.6 
8: 4.7 3.2 1.3 eer 7.6 
9: 4.6 3.1 1.5 eer 7.6 
10: 5.0 3.6 1.4 eer 7.6 

あなたが期待される出力で見ることができるように、setosa行1および2のためcol1col2ためとerr行6に同じ値を取り、7 col1col2に同じ値を取った:出力が期待

、その行を追加しませんでした(我々はそれらを一度考えました)。心配いけない程度col3col1col2が同じ値を取っている場合、それは同じ値を取ります

EDIT:セカンドをdput:

structure(list(col1 = c(5.1, 5.1, 4.7, 4.6, 5, 5.1, 5.1, 4.7, 
4.6, 5.1), col2 = c(3.5, 3.5, 3.2, 3.1, 3.6, 3.5, 3.5, 3.2, 3.1, 
3.4), col3 = c(1.4, 1.4, 1.3, 1.5, 1.4, 3.4, 3.4, 1.3, 1.5, 3.4 
), col4 = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B"), 
    count = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), r_new = c(5.6, 5.6, 
    5.6, 5.6, 5.6, 9.6, 9.6, 9.6, 9.6, 9.6)), .Names = c("col1", 
"col2", "col3", "col4", "count", "r_new"), row.names = c(NA, 
-10L), class = c("data.table", "data.frame")) 

    col1 col2 col3 col4 count r_new 
1: 5.1 3.5 1.4 A  1 5.6 
2: 5.1 3.5 1.4 A  1 5.6 
3: 4.7 3.2 1.3 A  1 5.6 
4: 4.6 3.1 1.5 A  1 5.6 
5: 5.0 3.6 1.4 A  1 5.6 
6: 5.1 3.5 3.4 B  1 9.6 
7: 5.1 3.5 3.4 B  1 9.6 
8: 4.7 3.2 1.3 B  1 9.6 
9: 4.6 3.1 1.5 B  1 9.6 
10: 5.1 3.4 3.4 B  1 9.6 

EDIT 2:サードをdput

col1 col2 col3 col4 count r_new 
1: 5.1 3.5 1.4 A  1 5.6 
2: 5.1 3.5 1.4 A  1 5.6 
3: 4.7 3.2 1.3 A  1 5.6 
4: 4.6 3.1 1.5 A  1 5.6 
5: 5.0 3.6 1.4 A  1 5.6 
6: 5.1 3.5 3.4 B  1 6.2 
7: 5.1 3.5 3.4 B  1 6.2 
8: 4.7 3.2 1.3 B  1 6.2 
9: 4.6 3.1 1.5 B  1 6.2 
10: 5.1 3.5 3.4 B  1 6.2 


structure(list(col1 = c(5.1, 5.1, 4.7, 4.6, 5, 5.1, 5.1, 4.7, 
4.6, 5.1), col2 = c(3.5, 3.5, 3.2, 3.1, 3.6, 3.5, 3.5, 3.2, 3.1, 
3.5), col3 = c(1.4, 1.4, 1.3, 1.5, 1.4, 3.4, 3.4, 1.3, 1.5, 3.4 
), col4 = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B"), 
    count = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), r_new = c(5.6, 5.6, 
    5.6, 5.6, 5.6, 6.2, 6.2, 6.2, 6.2, 6.2)), .Names = c("col1", 
"col2", "col3", "col4", "count", "r_new"), row.names = c(NA, 
-10L), class = c("data.table", "data.frame")) 
+0

あなたはあらかじめフィルタできませんか? –

+0

あなたは 'dat'と期待される出力を表示できますか – mtoto

+0

@mtoto私は例を追加しました。 – user3664020

答えて

3

col3jの中にサブセットすることができます。?data.table::duplicated

dat[, r_new := sum(col3[!duplicated(.SD, by = c("col1","col2"))], na.rm = T), by = col4] 

> dat 
#  col1 col2 col3 col4 count r_new 
# 1: 5.1 3.5 1.4 A  1 5.6 
# 2: 5.1 3.5 1.4 A  1 5.6 
# 3: 4.7 3.2 1.3 A  1 5.6 
# 4: 4.6 3.1 1.5 A  1 5.6 
# 5: 5.0 3.6 1.4 A  1 5.6 
# 6: 5.1 3.5 3.4 B  1 6.2 
# 7: 5.1 3.5 3.4 B  1 6.2 
# 8: 4.7 3.2 1.3 B  1 6.2 
# 9: 4.6 3.1 1.5 B  1 6.2 
#10: 5.1 3.5 3.4 B  1 6.2 
+0

ありがとうございます。私は別の疑問を持っていましたが、別の質問として投稿しました。 http://stackoverflow.com/questions/36233318/count-unique-by-2-columns-in-a-data-table あなたもそのことにお答えできますか? – user3664020

+0

はい。私は実験していましたが、問題が見つかりました。 2番目のdputを見てください。あなたの解決策は機能していません。なぜ私に教えてください? – user3664020

+0

2番目の例では、値が 'B'の場合、回答は9.6ではなく6.2でなければなりません。なぜそれが起こっているのですか? – user3664020

2

mtotoの回答を受け入れるのは簡単ですが、これは別の方法です。

DT[, r_new:=unique(.SD,by=c("col1","col2"))[,sum(col3, na.rm=TRUE)], by=col4] 
関連する問題