【问题标题】:How to restructure data with one observation by row into data with one observation by ID (and multiple columns) in R?如何在R中将具有一个观察值的数据重组为具有ID(和多列)的一个观察值的数据?
【发布时间】:2021-04-23 16:51:53
【问题描述】:

假设我有一个包含 3 个 ID 列和一个感兴趣的列的数据框。每行代表一个观察结果。一些 ID 有多个观察值,即多行。

df <- data.frame(id1 = c(  1,   2,   3,   4,   4), 
                 id2 = c( 11,  12,  13,  14,  14), 
                 id3 = c(111, 112, 113, 114, 114), 
                 variable_of_interest = c(13, 24, 35, 31, 12))

  id1 id2 id3 variable_of_interest
1   1  11 111                   13
2   2  12 112                   24
3   3  13 113                   35
4   4  14 114                   31
5   4  14 114                   12

我的目标是将其重组为每个 ID 一行,保留 3 个 ID 并将新列命名为“variable_of_interest1”、“variable_of_interest2”:

  id1 id2 id3 variable_of_interest1 variable_of_interest1
1   1  11 111                    13                    NA
2   2  12 112                    24                    NA
3   3  13 113                    35                    NA
4   4  14 114                    31                    12

解决方案可能需要reshape2dcast 函数,但直到现在,我都无法解决这个问题。

【问题讨论】:

    标签: r reshape2 dcast


    【解决方案1】:

    我们可以创建一个按 'id' 列分组的序列,然后用pivot_wider reshape to wide

    library(dplyr)
    library(stringr)
    library(tidyr)
    library(data.table)
    df %>% 
      mutate(ind = str_c('variable_of_interest', rowid(id1, id2, id3))) %>% 
      pivot_wider(names_from = ind, values_from = variable_of_interest)
    

    -输出

    # A tibble: 4 x 5
    #    id1   id2   id3 variable_of_interest1 variable_of_interest2
    #  <dbl> <dbl> <dbl>                 <dbl>                 <dbl>
    #1     1    11   111                    13                    NA
    #2     2    12   112                    24                    NA
    #3     3    13   113                    35                    NA
    #4     4    14   114                    31                    12
    

    或者另一个选项是data.table

    library(data.table)
    dcast(setDT(df),  id1 + id2 + id3 ~ 
      paste0('variable_of_interest', rowid(id1, id2, id3)),
          value.var = 'variable_of_interest')
    

    -输出

    #    id1 id2 id3 variable_of_interest1 variable_of_interest2
    #1:   1  11 111                    13                    NA
    #2:   2  12 112                    24                    NA
    #3:   3  13 113                    35                    NA
    #4:   4  14 114                    31                    12
    

    【讨论】:

    • 非常感谢!不幸的是,由于某些原因,我无法安装 tidyr...
    • @Antonin 你能检查data.table 解决方案是否适合你
    • 太棒了,谢谢!我没有使用rowid 函数。效果很好。
    猜你喜欢
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2023-01-16
    相关资源
    最近更新 更多