【问题标题】:dcast With multiple Ids and variables具有多个 Id 和变量的 dcast
【发布时间】:2020-05-11 02:10:52
【问题描述】:

我想“取消熔化”具有多个 ID 和多个熔化变量的 data.frame,但我被卡住了。

这是我的数据框的样子:

这是理想的结果

我试过了:

unmelted <- dcast(setDT(melted), Id, Date, Type ~  Score, Time, 
                                value.var = c("Score","Time"), sep = "")

unmelted <- melted %>%
   group_by(Id, Date, Type) %>%
   unite(variable, Score, Time)%>%
   spread(Score, Time, -Id, Date, Type) 

我不能使用pivot_wider

【问题讨论】:

标签: r dataframe data.table reshape tidyr


【解决方案1】:

我们可以使用

library(data.table)
dcast(setDT(df1), id + Date + Type ~ rowid(id, Date, Type),
     value.var = c("Score","Time"), sep = "")
#   id       Date Type Score1 Score2 Score3 Score4 Time1 Time2 Time3 Time4
#1:  1 2001-01-13  aaa    123    456    789     NA 12:12 13:12 14:12  <NA>
#2:  2 2001-01-16  ddd    113    145     NA     NA 15:12 16:12  <NA>  <NA>
#3:  3 2001-01-18  bbb    789    145    113    145 17:12 18:12 19:12 20:12

使用来自@M 的数据--

【讨论】:

  • 您好 akrun,谢谢您的回复。我不断收到我之前遇到的这个错误: .subset2(x, i, exact = exact) 中的错误:下标超出范围此外:警告消息:在 if (!(value.var %in% names(data) )) { : 条件长度 > 1 并且只使用第一个元素。你知道这意味着什么吗?
  • @DanielleTravassos 我的测试基于 M-- 帖子中的示例。如果您的列名不同,您可能需要相应更改
  • 嗨,Akrun,是的,有了他的数据,我收到了这条消息。
  • @DanielleTravassos 抱歉,不能用R 3.6.2packageVersion('data.table')# [1] ‘1.12.8’ 复制它
【解决方案2】:

tidyverse 解决方案,使用来自tidyr pacakge 的gatherspread

library(dplyr)
library(tidyr) #version 1.0.0 which has pivot_wider

df1 %>% 
  group_by(Type) %>% 
  mutate(name_x = row_number()) %>% 
  gather(key=var, value=val, c(Score, Time)) %>% 
  mutate(var = paste(var, name_x, sep="_")) %>% 
  select(-name_x) %>% 
  spread(key=var, value=val)

#> # A tibble: 3 x 11
#> # Groups:   Type [3]
#>      id Date  Type  Score_1 Score_2 Score_3 Score_4 Time_1 Time_2 Time_3 Time_4
#>   <dbl> <chr> <chr>   <dbl>   <dbl>   <dbl>   <dbl> <chr>  <chr>  <chr>  <chr> 
#> 1     1 2001~ aaa       123     456     789      NA 12:12  13:12  14:12  <NA>  
#> 2     2 2001~ ddd       113     145      NA      NA 15:12  16:12  <NA>   <NA>  
#> 3     3 2001~ bbb       789     145     113     145 17:12  18:12  19:12  20:12

您可以更方便地使用pivot_wider 做同样的事情:

df1 %>% 
  group_by(Type) %>% 
  mutate(name_x = row_number()) %>% 
  pivot_wider(id_cols = c("id","Date", "Type"), 
              names_from = c("name_x"), 
              values_from = c("Score", "Time"))

数据:

df1 <- data.frame(id=c(1,1,1,2,2,3,3,3,3),
                  Date = c(rep("2001-01-13", 3), rep("2001-01-16", 2), rep("2001-01-18", 4)),
                  Type = c(rep("aaa",3), rep("ddd", 2), rep("bbb",4)),
                  Score = c(123,456,789,113,145,789,145,113,145),
                  Time = paste0(12:20, ":12"),
                  stringsAsFactors = F)

【讨论】:

  • 这非常有效。我有个问题。结果与预期的一样,但我收到了这个错误。警告消息:度量变量的属性不相同;他们将被丢弃。谁能解释一下这到底是什么意思?
  • @DanielleTravassos 这不是错误。这是一个警告,表示每个组 (key) 的变量数量不一样。它按预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 2018-08-03
  • 2021-11-16
  • 2015-02-18
  • 1970-01-01
  • 2018-05-27
相关资源
最近更新 更多