【问题标题】:Splitting a dataframe column where new column values depend upon original data拆分新列值取决于原始数据的数据框列
【发布时间】:2017-04-23 05:06:16
【问题描述】:

我经常使用包含需要分隔字符串值的列的数据框。这是由数据输入程序中的“选择多个”选项造成的(不幸的是,我无法更改)。我试过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"))

我们将不胜感激任何正确方向的帮助。

【问题讨论】:

    标签: r tidyr


    【解决方案1】:

    我们可以试试separate_rowsdcast

    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
    

    或者另一种选择是使用来自splitstackshapecSplit 和来自data.tabledcast

    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][]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      相关资源
      最近更新 更多