簡體   English   中英

重塑 R 中的分組數據

[英]reshape grouped data in R

我有以下數據:

    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

我在下面嘗試過( 在 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")

也許…… 像這樣:

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.")

代表 package (v2.0.1) 於 2021 年 11 月 25 日創建

我想我已經按照本指南提出了一個答案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

另一種可能的解決方案:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM