1

少なくとも 2 つの異なる (一意の) 日付にリンゴまたはオレンジを持っていた人を見つけたいと考えています。個人が少なくとも 2 つの日付 (1 = はい、0 = いいえ) にオレンジまたはリンゴを持っていたかどうかのバイナリ インジケーターを含む新しい列を作成したいと思います。

私が最も近いのは、このプライヤーコードです。

df1<- ddply(df, .(names, fruit), mutate, acne = ifelse(fruit=="apple" | fruit=="orange" & length(unique(dates))>=2,1,0))

ただし、これは解決策ではありません。anne は同じ日に 2 回りんごを受け取りました。同様に、テッドはリンゴを 1 回しか持っていませんが、1 を獲得します。

これはより近いですが、まだ正しくありません。2 回発生した果物には 1 を与えます。1 人あたり 2 つの個別の日付で、1 人あたり 2 回果物が発生する必要があります。

df2<- ddply(df, .(fruit), mutate, acne = ifelse(length(unique(dates))>=2, 1, 0
##this one gives a 1 to any fruit that has occurred twice. Need the fruit to occur twice per person on two individual dates per person.

ここで誰かが私を正しい方向に向けることができれば、私はとても感謝しています.

前もって感謝します

サンプルDF

names<-as.character(c("john", "john", "philip", "ted", "john", "john", "anne", "john", "mary","anne", "mary","mary","philip","mary", "su","mary", "jim", "sylvia", "mary", "ted","ted","mary", "sylvia", "jim", "ted", "john", "ted"))
dates<-as.Date(c("2010-07-01", "2010-07-13", "2010-05-12","2010-02-14","2010-06-30","2010-08-15", "2010-03-21","2010-04-04","2010-09-01", "2010-03-21", "2010-12-01", "2011-01-01", "2010-08-12",  "2010-11-11", "2010-05-12",  "2010-12-03", "2010-07-12",  "2010-12-21", "2010-02-18",  "2010-10-29", "2010-08-13",  "2010-11-11", "2010-05-12",  "2010-04-01", "2010-05-06",  "2010-09-28", "2010-11-28" ))
fruit<-as.character(c("kiwi","apple","mango", "banana","strawberry","orange","apple","raspberry", "orange","apple","orange", "apple", "strawberry", "apple", "pineapple", "peach", "orange", "nectarine", "grape","banana", "melon", "apricot", "plum", "lychee", "mango", "watermelon", "apple" ))
df<-data.frame(names,dates,fruit)
df

望ましい出力

    names      dates      fruit v1
7    anne 2010-03-21      apple  0
10   anne 2010-03-21      apple  0
17    jim 2010-07-12     orange  0
24    jim 2010-04-01     lychee  0
1    john 2010-07-01       kiwi  1
2    john 2010-07-13      apple  1
5    john 2010-06-30 strawberry  1
6    john 2010-08-15     orange  1
8    john 2010-04-04  raspberry  1
26   john 2010-09-28 watermelon  1
9    mary 2010-09-01     orange  1
11   mary 2010-12-01     orange  1
12   mary 2011-01-01      apple  1
14   mary 2010-11-11      apple  1
16   mary 2010-12-03      peach  1
19   mary 2010-02-18      grape  1
22   mary 2010-11-11    apricot  1
3  philip 2010-05-12      mango  0
13 philip 2010-08-12 strawberry  0
15     su 2010-05-12  pineapple  0
18 sylvia 2010-12-21  nectarine  0
23 sylvia 2010-05-12       plum  0
4     ted 2010-02-14     banana  0
20    ted 2010-10-29     banana  0
21    ted 2010-08-13      melon  0
25    ted 2010-05-06      mango  0
27    ted 2010-11-28      apple  0
4

3 に答える 3

2

これはおそらくうまくいくはずです:

 v1 = ave(1:nrow(df),df$names,FUN=function(x) length(unique(df$dates[x[df$fruit[x]
                                              %in% c("orange","apple")]]))>1)
 df$v1 = v1
 df = df[order(df$names),]
于 2013-07-19T20:42:04.370 に答える
2

私が正しく理解していれば、問題の目的のために、りんご == オレンジです。したがって、計画は、(1) 果物がオレンジまたはリンゴのみである小さな data.frame を作成することです。他の果物は気にしないためです。(b) 一意の日付/名前の行のみを選択し、(c) 名前で集計し、 (d) 元の data.frame にマージして結果を取得します。

ndf <- subset(df, fruit %in% c("apple", "orange"))
ndf <- ndf[!duplicated(ndf[, c("names", "dates")]), ]

ここではテーブルを使用できますが、私は集約を好みます

v <- aggregate(rep(1, nrow(ndf)), by = ndf[, "names", drop = FALSE], sum)
v$x <- ifelse(v$x > 1, 1, 0)
rv <- merge(df, v)

コード的には、他の回答よりも少し長くなりますが、明確であり、最も確実に機能します。最初の 2 つの部分なしで集計を使用することもできますが、巨大な data.frame がある場合、すべての名前を集計すると非常にコストがかかる可能性があります。

于 2013-07-19T20:53:28.570 に答える