Создать новый фрейм данных с несколькими подмножествами одной и той же переменной - PullRequest
0 голосов
/ 08 сентября 2018

Я хотел бы создать новый фрейм данных, в котором столбцы представляют собой подмножества одной и той же переменной, которые разделены другой переменной. Например, я хотел бы создать новое подмножество переменной ('b'), где столбцы разделены на подмножество другой переменной ('year')

set.seed(88)
df <- data.frame(year = rep(1996:1998,3), a = runif(9), b = runif(9), e = runif(9)) 
df

  year          a          b         e
1 1996 0.41050128 0.97679183 0.7477684
2 1997 0.10273570 0.54925568 0.7627982
3 1998 0.74104481 0.74416429 0.2114261
4 1996 0.48007870 0.55296210 0.7377032
5 1997 0.99051343 0.18097104 0.8404930
6 1998 0.99954223 0.02063662 0.9153588
7 1996 0.03247379 0.33055434 0.9182541
8 1997 0.76020784 0.10246882 0.7055694
9 1998 0.67713100 0.59292207 0.4093590

Желаемый результат для переменной 'b' за 1996 и 1998 годы:

         V1         V2
1 0.9767918 0.74416429
2 0.5529621 0.02063662
3 0.3305543 0.59292207

Возможно, я мог бы найти способ сделать это с помощью цикла, но мне интересно, есть ли метрид dplyr (или какой-нибудь простой метод для этого).

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Еще один вариант с dplyr, смешивание с некоторой базой R, в результате чего крошечный бит короче, чем код @ akrun:

bind_cols(split(df$b, df$year)) %>% select(-'1997')

# A tibble: 3 x 2
  `1996` `1998`
   <dbl>  <dbl>
1  0.977 0.744 
2  0.553 0.0206
3  0.331 0.593 
0 голосов
/ 08 сентября 2018

Мы subset набор данных на основе 1996, 1998 в столбцах "год", select в столбцах "год", "b" и unstack для получения ожидаемого результата

unstack(subset(df, year %in% c(1996, 1998), select = c('year', 'b')), b ~ year)
#     X1996      X1998
#1 0.9767918 0.74416429
#2 0.5529621 0.02063662
#@3 0.3305543 0.59292207

Или, используя tidyverse, мы select представляем интересующие столбцы, filter строки на основе столбца 'year', создаем столбец последовательности в формате 'year', spread в формате 'wide' и select из ненужных столбцов

library(tidyverse)
df %>% 
   select(year, b) %>% 
   filter(year %in% c(1996, 1998)) %>%
   group_by(year = factor(year, levels = unique(year), labels = c('V1', 'V2'))) %>% 
   mutate(n = row_number()) %>%
   spread(year, b) %>%
   select(-n)
# A tibble: 3 x 2   
#     V1     V2
#   <dbl>  <dbl>
#1 0.977 0.744 
#2 0.553 0.0206
#3 0.331 0.593 

Поскольку существует только два года, мы также можем использовать summarise

df %>% 
   summarise(V1 = list(b[year == 1996]), V2 = list(b[year == 1998])) %>%
   unnest
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...