2017-04-23 11 views
1

分離が必要な文字列値の列を持つデータフレームで作業することがよくあります。これは、データ入力プログラムの「複数選択」オプションから発生します(残念ながら変更できません)。私はtidyr::separateを試しましたが、結果が正しく表示されません。例:新しい列の値が元のデータに依存するデータフレーム列の分割

require(tidyr) 
df = data.frame(
    x = 1:3, 
    sick = c(NA, "malaria", "diarrhoea malaria")) 

df <- df %>% 
    separate(sick, c("diarrhoea", "cough", "malaria"), 
      sep = " ", fill = "right", remove = FALSE) 

は、しかし、私は結果は次のようになりたい:

df2 = data.frame(
    x = 1:3, 
    sick = c(NA, "malaria", "diarrhoea malaria"), 
    diarrhoea = c(NA, NA, "diarrhoea"), 
    cough = c(NA, NA, NA), 
    malaria = c(NA, "malaria", "malaria")) 

右方向に任意の助けをいただければ幸いです。

答えて

1
我々は separate_rowsで試すことができ

library(tidyr) 
library(reshape2) 
library(dplyr) 
separate_rows(df, sick) %>% 
    mutate(sick = factor(sick, levels = c("diarrhoea", "cough", "malaria")), sick1 = sick) %>% 
    dcast(., x~sick, value.var = "sick1", drop=FALSE) %>% 
    bind_cols(., df[2]) %>% 
    select(x, sick, diarrhoea, cough, malaria) 
# x    sick diarrhoea cough malaria 
#1 1    <NA>  <NA> <NA> <NA> 
#2 2   malaria  <NA> <NA> malaria 
#3 3 diarrhoea malaria diarrhoea <NA> malaria 

dcastそれとも別のオプションは、data.table

library(splitstackshape) 
dcast(cSplit(df, "sick", " ", "long")[, sick:= factor(sick, levels = 
    c("diarrhoea", "cough", "malaria"))], x~sick, value.var = "sick", drop = FALSE)[, 
     sick := df$sick][] 
+1

おかげからdcastsplitstackshapeからcSplitを使用しているが、私は期待していたと同じように動作する、@akrun 。 –

関連する問題