0

私はこれを解決するために 4 日間を費やし、他の関連する質問から多くのことを学びましたが、それでも効率的な解決策を見つけることができませんでした。ここに行きます:

500k x 40 の変数を含むデータセットがあり、2 つの連続する行を比較するために変数を長い条件から広い条件に転置する必要があります。
データのサンプルは次のようになります。

df <- data.frame(id=c(267, 268, 269, 269, 270, 271, 272, 272, 273, 274),              
           quant=c(2,1,4,4,1,5,2,2,3,1),
           pts=  c(3,2,7,11,2,4,5,9,6,4),
           kind=c('v','v', 'v', 'c', 'v', 'v', 'v', 'c', 'v','v'))

    id quant pts kind
1  267     2   3    v
2  268     1   2    v
3  269     4   7    v
4  269     4  11    c
5  270     1   2    v
6  271     5   4    v
7  272     2   5    v
8  272     2   9    c
9  273     3   6    v
10 274     1   4    v

idが複製されるたびにquantが複製されることに注意してください。また、変数kindは、ある行では 'v' の値を想定し、別の行では 'c' の値を想定しています。逆に、'c' の値は重複したidを持つレコードにのみ表示されます。

次の data.frame を取得するつもりです。

    id quant pts kind  c
1  267     2   3    v  0
2  268     1   2    v  0
3  269     4   7    v 11
5  270     1   2    v  0
6  271     5   4    v  0
7  272     2   5    v  9
9  273     3   6    v  0
10 274     1   4    v  0    

次のコードを使用してそれを理解しました:

df$c <- 0
df$delete <- 0
for (i in 1:(dim(df)[1] - 1)) {
  if (df[i,'id'] == df[i+1, 'id'] & df[i+1, 'kind'] == 'c')
  {
    df[i, 'c'] <- df[i+1, 'pts']
    df[i+1, 'delete'] <- 1
  }
}
df <- df[df$delete == 0, ]
df$delete <- NULL    

元のデータセットでは ~ 10 時間かかりますが、うまくいきます。

適切なコードのアイデアはありますか?
どうもありがとう!

4

2 に答える 2

0

ここでは、パッケージ plyr を使用したアプローチ:

DF <- ddply(df, .(id), function(x) cbind(x[1,], c=x$pts[match("c", x$kind)]))
DF$c[is.na(DF$c)] <- 0
# or
DF <- ddply(df, .(id), function(x) cbind(x[1,], c=sum(x$pts*(x$kind=="c"))))
于 2013-04-10T08:08:14.900 に答える