【问题标题】:Spread with duplicate identifiers (using tidyverse and %>%) [duplicate]使用重复标识符传播(使用 tidyverse 和 %>%)[重复]
【发布时间】:2017-09-01 17:34:06
【问题描述】:

我的数据如下所示:

我试图让它看起来像这样:

我想在 tidyverse 中使用 %>%-chaining 来做到这一点。

df <- 
structure(list(id = c(2L, 2L, 4L, 5L, 5L, 5L, 5L), start_end = structure(c(2L, 
1L, 2L, 2L, 1L, 2L, 1L), .Label = c("end", "start"), class = "factor"), 
    date = structure(c(6L, 7L, 3L, 8L, 9L, 10L, 11L), .Label = c("1979-01-03", 
    "1979-06-21", "1979-07-18", "1989-09-12", "1991-01-04", "1994-05-01", 
    "1996-11-04", "2005-02-01", "2009-09-17", "2010-10-01", "2012-10-06"
    ), class = "factor")), .Names = c("id", "start_end", "date"
), row.names = c(3L, 4L, 7L, 8L, 9L, 10L, 11L), class = "data.frame")

我尝试过的:

data.table::dcast( df, formula = id ~ start_end, value.var = "date", drop = FALSE )  # does not work because it summarises the data

tidyr::spread( df, start_end, date )  # does not work because of duplicate values


df$id2 <- 1:nrow(df)
tidyr::spread( df, start_end, date ) # does not work because the dataset now has too many rows.

这些问题没有回答我的问题:

Using spread with duplicate identifiers for rows(因为他们总结)

R: spread function on data frame with duplicates(因为他们将值粘贴在一起)

Reshaping data in R with "login" "logout" times(因为没有使用 tidyverse 和链接专门询问/回答)

【问题讨论】:

  • as.data.table(df)[, .id := sequence(.N), .(id, start_end)][, dcast(.SD, .id + id ~ start_end, value.var = "date")]?
  • 使用reshape2dplyrdf %&gt;% group_by(id, start_end) %&gt;% arrange(date) %&gt;% mutate(sequence=1:n()) %&gt;% dcast(id + sequence ~ start_end, value="date")

标签: r dplyr tidyr tidyverse dcast


【解决方案1】:

我们可以使用tidyverse。按'start_end'、'id'分组后,创建序列列'ind',然后spread从'long'到'wide'格式

library(dplyr)
library(tidyr)
df %>%
   group_by(start_end, id) %>%
   mutate(ind = row_number()) %>%
   spread(start_end, date) %>% 
   select(start, end)
#     id      start        end
#* <int>     <fctr>     <fctr>
#1     2 1994-05-01 1996-11-04
#2     4 1979-07-18         NA
#3     5 2005-02-01 2009-09-17
#4     5 2010-10-01 2012-10-06

或者使用tidyr_1.0.0

chop(df, date) %>%
     spread(start_end, date) %>%
     unnest(c(start, end))

【讨论】:

    猜你喜欢
    • 2018-04-19
    • 2018-07-01
    • 2014-11-15
    • 2019-06-01
    • 2018-02-04
    • 2018-05-01
    • 1970-01-01
    • 2019-08-12
    相关资源
    最近更新 更多