2017-11-27 14 views
-3

dfのデータフレームとitemweekの2つのカラムがあります。これは、それがどのように見えるかです:Rデータフレーム内のアイテムの最初と最後の出現を検索

week   item 
1179   63230 
1179   63233 
1180   63230 
1180   63233 
1181   63230 
1181   63233 

私はデータフレーム内の各itemの発生の最初と最後のweekを見つけ、その後、最後の差分を計算し、weekを終了したいと思います。私はこのリンクで提供されているソリューションを使用しようとしました - How can I find the first and last occurrences of an element in a data.frame?。これは私に正しいスタートを与えるとweekを終了していない、

df_start <- df[!duplicated(df$item),]#Get starting week 
df_end <- df[rev(!duplicated(rev(df$ITEM))),]#Get ending week 

しかし:私が使用したコードは次のとおりです。誰かが私を助けてくれますか?

私はまた、期待される出力を含んでいます。 dfは約3万行を持っていますが、次のようにdfの上の部分のための出力は次のようになります。

>df_start 

item  start_week 
63230  1179 
63233  1179 

>df_end 

item  end_week 
63230  1181 
63233  1181 
+0

が私のために動作するようです。どうしたの? – thelatemail

+0

どこが違うのですか? –

+1

'df $ item'の代わりに' df_end'コードの 'df $ ITEM'を使います。 - Rは大文字と小文字を区別します。 – thelatemail

答えて

2

を使用することができます。

  • weekは数値です
  • itemは、常に次にこのdplyrソリューションが動作するはずweek

のために少なくとも1週間(無NA週間)

  • 「最後」「最大値」に相当すると関連している:

    library(dplyr) 
    df %>% 
        group_by(item) %>% 
        summarise(diff = max(week) - min(week)) %>% 
        ungroup() 
    
    # A tibble: 2 x 2 
        item diff 
        <int> <dbl> 
    1 63230  2 
    2 63233  2 
    
  • +0

    これは私にとって完璧に機能します!ありがとう! – Rnovice

    +0

    @Rnoviceグループごとに最初と最後の "week"値の差を求めましたが、これは最高値と最低値の差を示します。これは、 'week'が常にあなたのデータ内で増加している場合には同等ですが、あなたの質問はこれではっきりしません。 – Spacedman

    +0

    はい良い点。私の急いでの答えは、例のデータに基づいて、「最後」が「最大」に等しいと仮定していました。 – neilfws

    1

    あなたはあなたのデータについていくつかの仮定を作るdata.table

    このよう
    library(data.table) 
    
    df <- data.table(read.table(text = "week   item 
              1179   63230 
              1179   63233 
              1180   63230 
              1180   63233 
              1181   63230 
              1181   63233", header = T)) 
    
    df <- df[order(item), c(2,1)] 
    
    df_start <- df[,.(start_week = week[1]), by = item] 
    df_end <- df[,.(end_week = week[.N]), by = item] 
    
    > df_start 
        item start_week 
    1: 63230 1179 
    2: 63233 1179 
    > df_end 
        item end_week 
    1: 63230 1181 
    2: 63233 1181 
    
    0

    マイソリューションはすでに注文されているものとみなします。

    do.call(rbind, lapply(unique(df$week), function(x){head(df[df$week == x,], 1)})) 
    

    すべてのユニーク週間

    unique(df$week) 
    

    ヘッド

    function(x){head(df[df$week == x, ], 1) 
    

    各一意週間の値に関数を適用を使用して、各週の最初の行を取得値見出します。これは、データフレーム

    lapply(unique(df$week), function(x){head(df[df$week == x,], 1)}) 
    

    のリストを返します。その後、我々はあなたがtail

    0
    headを交換する場合、これはまた、週の終わりになるように変更することができます

    do.call(rbind, list) 
    

    を使用して、データフレームのリストをcombind

    ベースRのバージョンは次のように簡単です:

    > aggregate(df$week, list(df$item), 
          function(x){ 
          c(first=min(x), 
           last=max(x), 
           diff=diff(range(x))) 
          }) 
        Group.1 x.first x.last x.diff 
    1 63230 1179 1181  2 
    2 63233 1179 1181  2 
    

    はその後、行の順序の最初と最後に出現をしたいあなたは本当になかった場合:

    > aggregate(df$week, list(df$item), 
          function(x){ 
          first=x[1] 
          last=x[length(x)] 
          return(c(f=first,l=last,diff=last-first)) 
          }) 
    
    関連する問題