2017-05-22 10 views
0

私は3つの変数を持っています(,placeおよびgroup)。 1,2,3の3つのグループがあります。いずれかのグループの観測値がplace==1の観測値を持つ場合、その観測値をすべてTRUEとマークします。私は関数anyを使用しようとしており、内部データテーブルはJに参加していますが、機能していません。なぜ誰かがそれをやる方法を説明することはできますか?データテーブルと関数

目的の出力:グループ2はplace == 1での観測がないため、place1_groupFALSEである必要があります。他のグループは、place1_groupTRUEとする必要があります。

df2 <-structure(list(world = structure(c(1L, 2L, 3L, 3L, 3L, 5L, 1L, 
             4L, 2L, 4L), .Label = c("AB", "AC", "AD", "AE", "AF"), class = "factor"), 
        place = c(1, 1, 2, 2, 3, 3, 1, 2, 3, 1), 
        group = c(1,1, 1, 2, 2, 2, 3, 3, 3, 3)), .Names = c("world", "place","group"), row.names = c(NA, -10L), class = "data.frame") 

df2 <- data.table(df2) 
setDT(df2) 
setkey(df2, group) 

# Two step approach 
df2[,place1:=FALSE][place==1,place1:= TRUE] 
df2[,place1_group := FALSE][any(place1), place1_group := TRUE, by = group] # Not working, place1_group TRUE for all but it should be FALSE for group==2 


# Inside join approach 
df2[,test := "No place 1"][J(any(place1),by=group),test:="Yes Place 1", by=group] # Why it does not work for group 3? 
+1

しなければならない場合があり

は、 '' i'引数ではなく、 'j'引数内部any'を入れています。 – lmo

答えて

1
df2[,place1_group:=any(place==1),group][] 
#  world place group place1_group 
# 1: AB  1  1   TRUE 
# 2: AC  1  1   TRUE 
# 3: AD  2  1   TRUE 
# 4: AD  2  2  FALSE 
# 5: AD  3  2  FALSE 
# 6: AF  3  2  FALSE 
# 7: AB  1  3   TRUE 
# 8: AE  2  3   TRUE 
# 9: AC  3  3   TRUE 
# 10: AE  1  3   TRUE 
+1

なぜ最後の鎖の括弧は?彼らはどういう意味ですか? – user3507584

+2

@ user3507584結果を印刷します。 – lukeA

1

私はこのためにdplyrを使用します。

df.new <- df2 %>% 
      group_by(group) %>% 
      mutate(tf = any(place == 1)) 

これはTRUEまたはFALSEのいずれかとし、グループ全体をマークする必要があります。あなたはまた、上記のコードで

df.new <- data.table(df.new) 
+1

これは動作しますが、data.tableを短く/より良いプログラミングだと思っています。 – user3507584

関連する問題