2016-07-24 10 views
-3

dplyrを使って行を結合し、重複を削除し、空白も削除しようとしています。ここに私のデータフレームは、次のとおりです。重複を結合する、空白を公開しない、dplyr :: distinct

unique_id school subject grade sex 
    1  great Math  88  
    1  great English 78  
    1  great History 98 male 
    2  spring Math  65  
    2  spring English 72 female 
    2  spring History 84  

私は(あなたにAkrunに感謝)を実行すると:

(r2 <- df %>% 
    group_by(unique_id) %>% 
    summarise_each(funs(toString(unique(.))))) 

私が手:

unique_id school subject      grade  sex 
    1  great Math, English, History  88,78,98  , male 
    2  spring English, English, History 65,72,84  , female 

私はブランクが含まれる場合、またはカンマはありません最後の変数では、性別。代わりに、私は次のようにそれが見てみたい:

unique_id school subject      grade  sex 
    1  great Math, English, History  88,78,98  male 
    2  spring English, English, History 65,72,84  female 

どれ

は、凝縮した後、それを削除し、インポート時にNAを追加しようと、それは動作しませんでした。任意のアイデアをどのように行を凝縮するだけで、行の値を保持し、空白を無視?ありがとうございました。

+0

あなたの場合コンマを使いたくないのですが、なぜ 'toString'を使っていますか? –

+0

それは私に推奨されたものです。私はそれを置き換えることを何をお勧めしますか? – richiepop2

+0

sex列の空の文字列を各unique_idの同じ性別で置き換えてください。 – Psidom

答えて

4

おそらく、問題が発生している理由は、NAを使用する必要があるときに空の文字列を使用しているためです。これは、私が慣用コードであると想定するものです。

# A tibble: 2 x 5 
    unique_id school    subject  grade  sex 
     <dbl> <chr>     <chr>  <chr>  <chr> 
1   1 great Math, English, History 88, 78, 98 NA, male 
2   2 spring Math, English, History 65, 72, 84 NA, female 

を返し

df <- data.frame(unique_id = c(rep(1,3),rep(2,3)), 
       school = c(rep('great',3),rep('spring',3)), 
          subject = rep(c("Math", "English", "History"),2), 
          grade = c(88,78,98,65,72,84), 
          sex = c(NA,NA, "male", NA, "female", NA)) 

r2 <- df %>% 
    group_by(unique_id) %>% 
    summarise_each(funs(toString(unique(.)))) 

あなたはいつも

その後
r2$sex <- sapply(stringr::str_split(r2$sex, ", "),"[",2) 

場合本当にはそれらのNAを削除することができますが、私は情報としてそれらを参照してください。

summarize_eachに提供する独自の関数を書くことができます。これにより、任意の列のNAsを世話することができます。 uniqueは正当にもna.rm引数を持たないため、これを行う必要があることに注意してください。

rm_na_unique <- function(vec){ 
    unique(vec[!is.na(vec)]) 
} 

r2 <- df %>% 
     group_by(unique_id) %>% 
     summarise_each(funs(toString(rm_na_unique(.)))) 

がそこには空の文字列できなくなりますし、その後、あなたのソリューションが動作するようにあなたがsex列を埋めることができ

# A tibble: 2 x 5 
    unique_id school    subject  grade sex 
     <dbl> <chr>     <chr>  <chr> <chr> 
1   1 great Math, English, History 88, 78, 98 male 
2   2 spring Math, English, History 65, 72, 84 female 
+0

私は細胞内に麻薬を必要としません。私はブランクを無視し、値だけを含んでいます。上部に希望の最終結果が表示されます。ありがとうございました。 – richiepop2

+0

は完璧に動作します。ありがとうございます。簡単な質問ですが、すべてのNAをデータフレームから削除できますか?この特定のデータフレームには、200以上の観測値と30の変数があります。これは、各変数にこれを書くのにかなり時間がかかります。そのため、行を結合するときに空白や空白を取り除くことができたらと思っています。再度、感謝します。 – richiepop2

+4

再度編集しました。しかし、**真剣に**このインスタンスではNAsの使用を検討してください。彼らは無用ではありません。彼らはあなたに、各学校の3人の生徒についての情報がないことを伝えます。 – shayaa

1

あなたに同じ結果を与える:

library(dplyr) 
df %>% group_by(unique_id) %>% mutate(sex = unique(sex[sex != ""])) %>% 
     summarise_each(funs(toString(unique(.)))) 

# Source: local data frame [2 x 5] 
# 
# unique_id school    subject  grade sex 
#  <chr> <chr>     <chr>  <chr> <chr> 
# 1   1 great Math, English, History 88, 78, 98 male 
# 2   2 spring Math, English, History 65, 72, 84 female