【问题标题】:"partial" pivot wide in rr中的“部分”枢轴宽度
【发布时间】:2020-08-14 02:53:39
【问题描述】:

我有一个如下所示的数据框:

Time Y
1 2
1 3
1 2
2 5
2 7
2 5
3 10
3 9
3 8

我想创造一些看起来像的东西

Time R1 R2 R3
1 2 3 2
2 5 7 5
3 10 9 8

我必须保留时间列以进行进一步的回归分析。我可以通过使用 Time2=Time 并将 Time2 用于 names_from 参数来完成此操作。但是,我收到以下错误:

> foo
  Time  Y Time2
1    1  2     1
2    1  3     1
3    1  2     1
4    2  5     2
5    2  7     2
6    2  5     2
7    3 10     3
8    3  9     3
9    3  8     3
> pivot_wider(foo, names_from=Time2, values_from=Y)
# A tibble: 3 x 4
   Time `1`       `2`       `3`      
  <dbl> <list>    <list>    <list>   
1     1 <dbl [3]> <NULL>    <NULL>   
2     2 <NULL>    <dbl [3]> <NULL>   
3     3 <NULL>    <NULL>    <dbl [3]>
Warning message:
Values in `Y` are not uniquely identified; output will contain list-cols.
* Use `values_fn = list(Y = list)` to suppress this warning.
* Use `values_fn = list(Y = length)` to identify where the duplicates arise
* Use `values_fn = list(Y = summary_fun)` to summarise duplicates 

我不确定我做错了什么。

【问题讨论】:

    标签: r pivot tidyr


    【解决方案1】:

    也许以下基本 R 选项可以提供帮助

    • 使用unstack:
    p <- unstack(foo,Y~Time)
    res <- data.frame(Time = gsub("X","",names(p)),
                      `colnames<-`(unname(t(p)),
                                   paste0("R",seq(ncol(p)))))
    
    • 使用reshape:
    res <- reshape(within(foo,ID <- ave(Y,Time,FUN = seq_along)),
                   direction = "wide",
                   idvar = "Time",
                   timevar = "ID")
    res <- setNames(res,gsub("^Y\\.","R",names(res)))
    

    这样

    > res
      Time R1 R2 R3
    1    1  2  3  2
    2    2  5  7  5
    3    3 10  9  8
    

    数据

    foo <- structure(list(Time = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), 
        Y = c(2L, 3L, 2L, 5L, 7L, 5L, 10L, 9L, 8L)), class = "data.frame", row.names = c(NA, 
    -9L))
    

    【讨论】:

      【解决方案2】:

      这只是一条警告消息,因为“Time2”有重复项。相反,我们可以根据“Time”或“Time2”创建一个序列列

      library(dplyr)
      library(tidyr)
      library(data.table)
      foo %>% 
          mutate(rn = str_c('R', rowid(Time))) %>%
          pivot_wider(names_from = rn, values_from = Y)
      # A tibble: 3 x 4
      #   Time    R1    R2    R3
      #  <int> <int> <int> <int>
      #1     1     2     3     2
      #2     2     5     7     5
      #3     3    10     9     8
      

      【讨论】:

      • 谢谢,成功了。我非常接近,尝试使用 mutate,但没有创建正确的行 ID!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 2021-10-10
      • 2014-02-25
      • 1970-01-01
      相关资源
      最近更新 更多