Изменение формы данных с помощью Tidyr - PullRequest
0 голосов
/ 30 октября 2018

У меня есть данные в формате:

  sample  height  width  weight
1 a       h1      w1     p1    
2 a       h2      w2     p2    
3 b       h3      w3     p3    
4 b       h4      w4     p4

, где h1 и h2 - повторные измерения для высоты образца "a", h3 и h4 - повторные измерения для образца "b" и т. Д.

Мне нужно поставить дубликаты измерений рядом:

  sample height1 height2 width1 width2 weight1 weight2
1 a       h1      h2      w1     w2     p1      p2    
2 b       h3      h4      w3     w4     p3      p4    

Я возился с gather и spread, но не смог получить то, что хотел. Любая помощь, пожалуйста?

Спасибо!

Данные

df1 <- structure(list(sample = c("a", "a", "b", "b"), height = c("h1", 
"h2", "h3", "h4"), width = c("w1", "w2", "w3", "w4"), weight = c("p1", 
"p2", "p3", "p4")), .Names = c("sample", "height", "width", "weight"
), row.names = c(NA, -4L), class = "data.frame")

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Хотя вы просили tidyr::spread, я предоставляю решение, используя data.table dcast

library(data.table)
setDT(df1)
dcast(df1, sample ~ rowid(sample), value.var = c("height", "width", "weight"), sep = "")
#   sample height1 height2 width1 width2 weight1 weight2
#1: a       h1      h2      w1     w2     p1      p2    
#2: b       h3      h4      w3     w4     p3      p4 
0 голосов
/ 30 октября 2018

Мы можем gather перевести в «длинный» формат, а затем spread вернуть его в «широкий» формат после создания столбца последовательности по группе

library(tidyverse)
df1 %>%
  gather(key, val, height:weight) %>% 
  group_by(sample, key) %>% 
  mutate(n = row_number()) %>%
  unite(keyn, key, n, sep="") %>% 
  spread(keyn, val)
# A tibble: 2 x 7
# Groups:   sample [2]
#   sample height1 height2 weight1 weight2 width1 width2
#  <chr>  <chr>   <chr>   <chr>   <chr>   <chr>  <chr> 
#1 a      h1      h2      p1      p2      w1     w2    
#2 b      h3      h4      p3      p4      w3     w4    

Или другой вариант с tidyverse

df1 %>%
    group_by(sample) %>%
    nest %>% 
    mutate(data = map(data, ~ 
                       unlist(.x) %>% 
                       as.list %>%
                       as_tibble)) %>% 
    unnest

Или мы можем использовать reshape из base R

df1$ind <- with(df1, ave(seq_along(sample), sample, FUN = seq_along))
reshape(df1, idvar= c("sample"), timevar = "ind", direction = "wide")
#   sample height.1 width.1 weight.1 height.2 width.2 weight.2
#1      a       h1      w1       p1       h2      w2       p2
#3      b       h3      w3       p3       h4      w4       p4

данные

df1 <- structure(list(sample = c("a", "a", "b", "b"), height = c("h1", 
 "h2", "h3", "h4"), width = c("w1", "w2", "w3", "w4"), weight = c("p1", 
 "p2", "p3", "p4")), class = "data.frame", row.names = c(NA, -4L
  ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...