【问题标题】:reshape grouped data in R重塑 R 中的分组数据
【发布时间】:2021-11-25 09:32:17
【问题描述】:

我有以下数据:

    id <- c(1,1,1,1,2,2,2,2,2,2)
    date <-as.Date(c("2007-06-22", "2007-06-22", "2007-07-13","2007-07-13", 
                     "2019-10-05", "2019-10-05", "2019-11-07", "2019-11-07",
                     "2007-06-22","2007-06-22"))
    value <-c(0,3,2,4,0,1,4,2,6,8)
    
    mydata_1 <- data.frame(id, date, value)
    mydata_1

id    date        value
1    2007-06-22     0
1    2007-06-22     3
1    2007-07-13     2
1    2007-07-13     4
2    2019-10-05     0
2    2019-10-05     1
2    2019-11-07     4
2    2019-11-07     2
2    2007-06-22     6
2    2007-06-22     8

我希望数据看起来像这样:

id <- c(1,1,2,2,2)
date <-as.Date(c("2007-06-22", "2007-07-13", "2019-10-05", "2019-11-07","2007-06-22"))
value.1 = c(0,2,0,4,6)
value.2 = c(3,4,1,2,8)

mydata_2 <- data.frame(id, date, value.1, value.2)
mydata_2

id    date       value.1   value.2
1     2007-06-22   0       3
1     2007-07-13   2       4
2     2019-10-05   0       1
2     2019-11-07   4       2
2     2007-06-22   6       8

我从 (Reshaping data matrix in R) 尝试过,但由于两个不同 ID 中的某些日期相同,因此无法按预期工作

dateno <- with(mydata_1, ave(id, date, FUN = seq_along))

test2 <- transform(mydata_1, dateno = dateno)
reshape(test2, dir = "wide", idvar = c("id","date"), timevar = "dateno")

【问题讨论】:

  • 这能回答你的问题吗? "spread" multiple variables using pivot_wider()
  • 为什么要在结果中包含 id 列?每个日期和 ID 只有两个值,对吗?所以在你的结果中,每个日期只有一行,而不是每个 ID?
  • 感谢您的提示。我试图用 pivot_wider 解决它,但没有运气。在“真实数据”中,我使用的“价值”列代表了在不同日期填写的 34 项自我评估表上的答案。所以我需要知道:谁给表格打分(id)分数是多少(值)以及每个人给表格打分的日期(日期)。

标签: r reshape


【解决方案1】:

我想我已经按照本指南 How to transpose a data frame by group using reshape2 library? 找到了答案

mydata_1 = mydata_1 %>% group_by(id,date) %>% mutate(id_2 = paste0("V",row_number()))
        
        library(tidyr)
        mydata_2 = spread(data = my, key = id_2, value = value)
    
        mydata_2
    
    id date          V1    V2
      <dbl> <date>     <dbl> <dbl>
    1     1 2007-06-22     0     3
    2     1 2007-07-13     2     4
    3     2 2007-06-22     6     8
    4     2 2019-10-05     0     1
    5     2 2019-11-07     4     2

【讨论】:

    【解决方案2】:

    也许……像这样:

    library(tidyverse)
    
    id <- c(1, 1, 1, 1, 2, 2, 2, 2, 2, 2)
    date <- as.Date(c(
      "2007-06-22", "2007-06-22", "2007-07-13", "2007-07-13",
      "2019-10-05", "2019-10-05", "2019-11-07", "2019-11-07",
      "2007-06-22", "2007-06-22"
    ))
    value <- c(0, 3, 2, 4, 0, 1, 4, 2, 6, 8)
    
    mydata_1 <- data.frame(id, date, value)
    mydata_1
    
    mydata_1 %>%
      group_by(id, date) %>%
      mutate(visit = row_number()) %>%
      complete(id, date, fill = list(value = 0)) %>%
      pivot_wider(names_from = visit, values_from = value, names_prefix = "value.")
    

    reprex package (v2.0.1) 于 2021 年 11 月 25 日创建

    【讨论】:

    • 感谢您的帮助,但这不是我想要的结果。人 1 对“表格”进行了两次评级(分别在 2007-06-22 和 2007-07-13)。第 2 个人对“表格”进行了 3 次评价(2007-06-22、2019-10-05、2019-11-07)
    【解决方案3】:

    另一种可能的解决方案:

    library(tidyverse)
    
    id <- c(1,1,1,1,2,2,2,2,2,2)
    date <-as.Date(c("2007-06-22", "2007-06-22", "2007-07-13","2007-07-13", 
                     "2019-10-05", "2019-10-05", "2019-11-07", "2019-11-07",
                     "2007-06-22","2007-06-22"))
    value <-c(0,3,2,4,0,1,4,2,6,8)
    mydata_1 <- data.frame(id, date, value)
    
    mydata_1 %>% 
      group_by(id, date) %>% 
      summarise(value = str_c(value, collapse = ","), .groups = "drop") %>% 
      separate(value, into=c("value1", "value2"), sep=",", convert = T)
    
    #> # A tibble: 5 × 4
    #>      id date       value1 value2
    #>   <dbl> <date>      <int>  <int>
    #> 1     1 2007-06-22      0      3
    #> 2     1 2007-07-13      2      4
    #> 3     2 2007-06-22      6      8
    #> 4     2 2019-10-05      0      1
    #> 5     2 2019-11-07      4      2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      相关资源
      最近更新 更多