4

私が間違っていることについてはおそらく本当に簡単な説明がありますが、今日はかなり長い間これに取り組んできましたが、まだこれを機能させることができません。これは公園を散歩するようなものだと思っていましたが、私のコードは期待どおりに機能していません。

この例では、次のようなデータ フレームがあるとします。

df
Row#   user      columnB    
1        1          NA        
2        1          NA        
3        1          NA        
4        1          31        
5        2          NA        
6        2          NA        
7        2          15        
8        3          18        
9        3          16       
10       3          NA

基本的に、最初の (および最後の) 関数 (TTR ライブラリ パッケージ内) を使用して、各ユーザーの最初の非 NA 値を取得する新しい列を作成したいと思います。したがって、私の目的のデータフレームはこれになります。

df
Row#   user      columnB    firstValue
1        1          NA        31
2        1          NA        31 
3        1          NA        31
4        1          31        31
5        2          NA        15
6        2          NA        15 
7        2          15        15
8        3          18        18
9        3          16        18
10       3          NA        18

私は主にグーグルを使って見回しましたが、正確な答えを見つけることができませんでした。

これは私が試した私のコードの一部ですが、私が望んでいた結果が得られませんでした (メモ、これは記憶から持ってきているので、これらにはさらに多くのバリエーションがありますが、これらは一般的な形式です私が試してきたこと)。

    df$firstValue<-ave(df$columnB,df$user,FUN=first,na.rm=True)
    df$firstValue<-ave(df$columnB,df$user,FUN=function(x){x,first,na.rm=True})
    df$firstValue<-ave(df$columnB,df$user,FUN=function(x){first(x,na.rm=True)})
    df$firstValue<-by(df,df$user,FUN=function(x){x,first,na.rm=True})

失敗しました。これらは各グループの最初の値を与えるだけで、NA になります。

繰り返しますが、これらは私の頭の上からのほんの数例です。na.exclude、na.omit、na.action(na.omit) などを使用して、na.rm で遊んでみました...

どんな助けでも大歓迎です。ありがとう。

4

4 に答える 4

4

解決data.table

require(data.table)
DT <- data.table(df, key="user")
DT[, firstValue := na.omit(columnB)[1], by=user]
于 2013-02-25T15:29:41.217 に答える
3

これが解決策plyrです:

ddply(df, .(user), transform, firstValue=na.omit(columnB)[1])

与える:

  Row user columnB firstValue
1   1    1      NA         31
2   2    1      NA         31
3   3    1      NA         31
4   4    1      31         31
5   5    2      NA         15
6   6    2      NA         15
7   7    2      15         15
8   8    3      18         18
9   9    3      16         18

最後の値をキャプチャしたい場合は、次のことができます。

ddply(df, .(user), transform, firstValue=tail(na.omit(columnB),1))
于 2013-02-25T15:34:20.450 に答える
3

使用するdata.table

library (data.table)
DT <- data.table(df, key="user")
DT <- setnames(DT[unique(DT[!is.na(columnB), list(columnB), by="user"])], "columnB.1", "first")
于 2013-02-25T15:38:46.543 に答える
2

非常に小さなヘルパー関数を使用する

finite <- function(x) x[is.finite(x)]

これは、標準のR関数のみを使用するワンライナーです。

df <- cbind(df, firstValue = unlist(sapply(unique(df[,1]), function(user) rep(finite(df[df[,1] == user,2])[1], sum(df[,1] == user))))

より良い概要のために、ここに「マルチライナー」に展開されたワンライナーがあります:

# for each user, find the first finite (in this case non-NA) value of the second column and replicate it as many times as the user has rows
# then, the results of all users are joined into one vector (unlist) and appended to the data frame as column
df <- cbind(
  df,
  firstValue = unlist(
    sapply(
       unique(df[,1]),
       function(user) {
         rep(
           finite(df[df[,1] == user,2])[1],
           sum(df[,1] == user)
         )
       }
    )
  )
)
于 2013-02-25T15:47:26.513 に答える