【问题标题】:Using Dplyr to spread from long to wide; more elegant solution?使用Dplyr从长向宽传播;更优雅的解决方案?
【发布时间】:2018-04-24 23:33:05
【问题描述】:

这是我拥有的长格式数据示例:

ID   value1     value2
1   4.333333   3.833333
1   4.333333   3.333333
2   4.583333   5.500000
2   3.916667   3.750000
3   4.500000   4.666667
3   4.333333   4.500000

我需要像这样将它转换为宽格式:

ID   value1A    value1B   value2A    value2B
1   4.333333   3.833333  4.333333   3.833333 
2   4.333333   3.333333  4.333333   3.833333
3   4.583333   5.500000  4.333333   3.833333

为了使用整洁的诗句来实现这一点,我做了以下事情:

ds_spread <- gather(ds,condition, value, contains("value")) %>% 
  separate(condition, into = c("t1", "t2")) %>% 
  arrange(ID) %>% 
  group_by(ID) %>% 
  mutate(rownum = row_number()) %>% 
  select(-t1,-t2) %>% 
  spread(rownum, value)

我最终得到了我想要的结果。然而,这是偶然的吗?收集 %>% 分离 %>% 排列 %>% 变异 %>% 选择有必要吗?有没有更优雅的解决方案?

【问题讨论】:

标签: r dplyr tidyverse


【解决方案1】:

这是一种选择。

library(dplyr)
library(tidyr)

dat2 <- dat %>%
  group_by(ID) %>%
  mutate(Letter = LETTERS[row_number()]) %>%
  ungroup() %>%
  gather(Value, Number, starts_with("value")) %>%
  unite(Col, Value, Letter, sep = "") %>%
  spread(Col, Number) 
dat2
# # A tibble: 3 x 5
#      ID value1A value1B value2A value2B
#   <int>   <dbl>   <dbl>   <dbl>   <dbl>
# 1     1    4.33    4.33    3.83    3.33
# 2     2    4.58    3.92    5.50    3.75
# 3     3    4.50    4.33    4.67    4.50

数据

dat <- read.table(text = "ID   value1     value2
1   4.333333   3.833333
1   4.333333   3.333333
2   4.583333   5.500000
2   3.916667   3.750000
3   4.500000   4.666667
3   4.333333   4.500000",
                  header = TRUE, stringsAsFactors = FALSE)

【讨论】:

猜你喜欢
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 2011-02-13
  • 1970-01-01
相关资源
最近更新 更多