【问题标题】:Separate single column into multiple depending on unique values根据唯一值将单列分成多列
【发布时间】:2018-02-27 13:34:36
【问题描述】:

假设您有一个如下所示的数据表

我为糟糕的格式道歉

name  time  code val
cat   2012  a2   2321
dog   1980  b2   424
cat   2101  c6   34
moose 2310  c6   5.6
dog   1972  h9   34
lion  1982  g8   12

我希望它获取所有唯一代码,以便表格像这样排列

name  time  a2   b2   c6   h9   g8
cat   2012  2321 NA   NA   NA   NA
dog   1980  NA   424  NA   NA   NA
cat   2101  NA   NA   34   NA   NA
moose 2310  NA   NA   5.6  NA   NA
dog   1972  NA   NA   NA   34   NA
lion  1982  NA   NA   NA   NA   12

有人可以描述我将如何在 R 中执行此操作吗?您不必提供任何代码,但有关如何执行此操作的一些指示会很好​​。我正在使用的数据集要大得多,并且可能包含许多重复项。

感谢任何建议

感谢您的阅读

【问题讨论】:

    标签: r dplyr tidyr data-cleaning tidy


    【解决方案1】:

    reshape2 使这些转换非常简单。

    require(reshape2)
    
    df1 <- structure(list(name = structure(c(1L, 2L, 1L, 4L, 2L, 3L), .Label = c("cat", 
    "dog", "lion", "moose"), class = "factor"), time = c(2012L, 1980L, 
    2101L, 2310L, 1972L, 1982L), code = structure(c(1L, 2L, 3L, 3L, 
    5L, 4L), .Label = c("a2", "b2", "c6", "g8", "h9"), class = "factor"), 
        val = c(2321, 424, 34, 5.6, 34, 12)), .Names = c("name", 
    "time", "code", "val"), class = "data.frame", row.names = c(NA, 
    -6L))
    
    dcast(df1, name + time ~ code, value.var="val")
    
       name time   a2  b2   c6 g8 h9
    1   cat 2012 2321  NA   NA NA NA
    2   cat 2101   NA  NA 34.0 NA NA
    3   dog 1972   NA  NA   NA NA 34
    4   dog 1980   NA 424   NA NA NA
    5  lion 1982   NA  NA   NA 12 NA
    6 moose 2310   NA  NA  5.6 NA NA
    

    或与tidyr::spread 类似。 tidyr 更直观一点,使用格式spread(data, &lt;column name whose values will be used as headings&gt;, values)

    spread(df1,code,val)
    

    【讨论】:

      【解决方案2】:

      我只是在这里为@Mako212 提到的spread 添加工作示例:

      library(tidyverse)
      
      df <- tribble(
      ~name,  ~time,  ~code, ~val,
      "cat",   2012,  "a2",   2321,
      "dog",   1980,  "b2",   424,
      "cat",   2101,  "c6",   34,
      "moose", 2310,  "c6",   5.6,
      "dog",   1972,  "h9",   34,
      "lion",  1982,  "g8",   12)
      
      df %>% spread(code, val)
      #> # A tibble: 6 x 7
      #>    name  time    a2    b2    c6    g8    h9
      #> * <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
      #> 1   cat  2012  2321    NA    NA    NA    NA
      #> 2   cat  2101    NA    NA  34.0    NA    NA
      #> 3   dog  1972    NA    NA    NA    NA    34
      #> 4   dog  1980    NA   424    NA    NA    NA
      #> 5  lion  1982    NA    NA    NA    12    NA
      #> 6 moose  2310    NA    NA   5.6    NA    NA
      

      如果在示例输出中保持行顺序很重要,那么只需在使用 spread 之前添加 rownames_to_column()

      df %>% 
        rownames_to_column() %>%
        spread(code, val) 
      #> # A tibble: 6 x 8
      #>   rowname  name  time    a2    b2    c6    g8    h9
      #> *   <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
      #> 1       1   cat  2012  2321    NA    NA    NA    NA
      #> 2       2   dog  1980    NA   424    NA    NA    NA
      #> 3       3   cat  2101    NA    NA  34.0    NA    NA
      #> 4       4 moose  2310    NA    NA   5.6    NA    NA
      #> 5       5   dog  1972    NA    NA    NA    NA    34
      #> 6       6  lion  1982    NA    NA    NA    12    NA
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-07
        • 2015-05-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多