2017-11-07 25 views
1

tidyrRから使用しています。重複した識別子でspread()コマンドを使用しているときに問題が発生しています。ここでtidyrで重複している識別子エラー

は、問題を示しモック例です。私は、このコマンドを実行すると

X = data.frame(name=c("Eric","Bob","Mark","Bob","Bob","Mark","Eric","Bob","Mark"), 
       metric=c("height","height","height","weight","weight","weight","grade","grade","grade"), 
       values=c(6,5,4,120,118,180,"A","B","C"), 
       stringsAsFactors=FALSE) 

tidyr::spread(X,metric,values) 

は、だから私は、次のエラーを取得する:ボブなので、

Error: Duplicate identifiers for rows (4, 5) 

なぜそのエラー理にかなっています重量について2回記録した。ボブは彼の体重を2度記録していたので、実際には間違いではありません。私は、コマンドを実行しているされて行うことができるようにしたいと思い、それはそれは次のように私をお返ししています

name height weight grade 
Eric  6  NA  A 
Bob  5 120  B 
Bob  5 118  B 
Mark  4 180  C 

は、私はこれを達成するために使用されなければならないコマンドを広めていませんか?簡単な解決法がない場合は、spread()コマンドを実行するときに重複の少ない重量でレコードを削除する簡単な方法はありますか?

答えて

2

各グループ内のインデックスを表す新しい変数を作成することによって、ユニークな識別子を作成した後、fillを使用して、2番目の「Bob」行に「height」と「grade」の重複値を入力できます。

最後にインデックス変数を削除するには、selectを使用します。各name/metricグループの最大値にfilter

library(dplyr) 
library(tidyr) 

X %>% 
    group_by(name, metric) %>% 
    mutate(row = row_number()) %>% 
    spread(metric, values) %>% 
    fill(grade, height) %>% 
    select(-row) 

# A tibble: 4 x 4 
# Groups: name [3] 
    name grade height weight 
    <chr> <chr> <chr> <chr> 
1 Bob  B  5 120 
2 Bob  B  5 118 
3 Eric  A  6 <NA> 
4 Mark  C  4 180 

X %>% 
    group_by(name, metric) %>% 
    filter(values == max(values)) %>% 
    spread(metric, values) 

# A tibble: 3 x 4 
# Groups: name [3] 
    name grade height weight 
* <chr> <chr> <chr> <chr> 
1 Bob  B  5 120 
2 Eric  A  6 <NA> 
3 Mark  C  4 180 
+0

あなたは 'グループ化を経由して、物事を削除することができます – RustyStatistician

+0

最小値を持つものを取り除くだけで言うのは簡単な方法はあります各「名前」/「メトリック」の組み合わせの最大値のみを選択します。 – aosmith

+0

あなたは(この 'X%>%(メトリック名) GROUP_BY%>% 変異(行= ROW_NUMBER()、 少なくとも=分(行))%>% 広がりと最小値を削除することができ%)% フィル(等級、高さ)%>% フィルター(行==少なくとも)%>% select(-row、-least) '' ' –

関連する問題