R как преобразовать данные в переменную столбца, чтобы стать именами строк и извлечь конкретные данные других переменных? - PullRequest
1 голос
/ 23 октября 2019

У меня возникли проблемы с преобразованием расплавленных данных из длинных в широкие, а также фильтрацией одновременно. Я могу перейти к подмножеству ранее, но я хотел бы сделать их одновременно и сохранить их как разные таблицы.

ID,freq,Subject,Time
aaaaa,5545,M1,0
aaaaa,5471,M2,0
aaaaa,5029,M3,0
aaaaa,4531,M1,3h
aaaaa,4523,M2,3h
aaaaa,3915,M3,3h
aaaaa,3800,M1,1day
aaaaa,3609,M2,1day
aaaaa,3427,M3,1day
bbbb,3426,M1,0
bbbb,3272,M2,0
bbbb,3266,M3,0
bbbb,5545,M1,3h
bbbb,5471,M2,3h
bbbb,5029,M3,3h
bbbb,4532,M2,1day
bbbb,4533,M3,1day

это фрагмент из моих данных. Я хотел бы получить таблицу, как показано ниже, и сохранить каждый предмет в отдельном объекте (M1, M2 и M3 ...). Я читаю и пытаюсь изменить форму и привести команды, но не могу управлять тем, что мне нужно. как вы можете управлять таблицей, как показано ниже? Спасибо за помощь и предложения.

ID     0     3h   1day
aaaaa  5545 4531 3800
bbbb   3426 5545 4531

1 Ответ

0 голосов
/ 23 октября 2019

Используя dcast, вы можете сделать:

df <- reshape2::dcast(df, ID + Subject ~ Time, value.var = "freq")
df_list <- split(x, x$Subject)

$M1
                ID Subject    0 1day   3h
1            aaaaa      M1 5545 3800 4531
4             bbbb      M1 3426   NA 5545

$M2
                ID Subject    0 1day   3h
2            aaaaa      M2 5471 3609 4523
5             bbbb      M2 3272 4532 5471

Другой вариант:

library(dplyr)
library(tidyr)

df %>% 
spread(Time, freq) %>% 
group_split(., Subject)

Данные

df <- structure(list(ID = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("           aaaaa", 
"           bbbb"), class = "factor"), freq = c(5545L, 5471L, 
5029L, 4531L, 4523L, 3915L, 3800L, 3609L, 3427L, 3426L, 3272L, 
3266L, 5545L, 5471L, 5029L, 4532L, 4533L), Subject = structure(c(1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 2L, 3L
), .Label = c("M1", "M2", "M3"), class = "factor"), Time = structure(c(1L, 
1L, 1L, 3L, 3L, 3L, 2L, 2L, 2L, 1L, 1L, 1L, 3L, 3L, 3L, 2L, 2L
), .Label = c("0", "1day", "3h"), class = "factor")), class = "data.frame", row.names = c(NA, 
-17L))
...