2015-12-14 1 views
2

Я унаследовал набор данных, который составляет 23 атрибута, измеренных для каждого из 13 имен (между субъектами - каждый участник оценил только одно имя по всем этим атрибутам). Сейчас он структурирован таким образом, что атрибуты являются самым быстрым фактором, за которым следует имя. Таким образом, данные выглядят следующим образом:Данные реструктуризации с использованием семейства приложений

Sub# N1-item1 N1-item2 N1-item3 […] N2-item1 N2-item2 N2-item3 
1  3   5   3    NA  NA  NA 
2  NA  NA  NA    1   5   3 
3  3   5   3    NA  NA  NA 
4  NA  NA  NA    2   2   1 

Она должна быть перестроена это таким образом, что она свернута над именем, и все ITEM1 записей одинаков столбец (субъекты не имеет значения для этой цели), а ниже (имея в виду, что существует 23 пунктов не 3 и 13 имен не 2):

Name item1  item2  item3 
N1  3   5   3    
N2  1   5   3 

Я могу сделать это с помощью петель и, но я предпочел бы сделать это таким образом, более естественно R, что Я предполагаю, что это будет одно из применяемых семейств функций, но я не могу полностью обернуть вокруг себя - какой уловкий способ сделать это?

ответ

2

Вот ответ, используя dplyr и tidyr:

library(dplyr)#loads libraries 
library(tidyr) 
dat %>% #name of your dataframe 
gather(key, val, -Sub) %>% #gathers to long data, with id as Sub 
filter(!is.na(val)) %>% #removes rows with NA for the value 
separate(key, c("Name", "item")) %>% #split the column key into Name and item 
spread(item, val) #spreads the data into wide format, with item as the columns 

    Sub Name item1 item2 item3 
1 1 N1  3  5  3 
2 2 N2  1  5  3 
3 3 N1  3  5  3 
4 4 N2  2  2  1 
1

Спин имена столбцов вокруг быть itemX-NY, а затем пусть reshape разбирайтесь:

names(dat)[-1] <- gsub("(^.+?)-(.+?$)", "\\2-\\1", names(dat)[-1]) 
na.omit(reshape(dat, direction="long", idvar="Sub", varying=-1, sep="-")) 

#  Sub time item1 item2 item3 
#1.N1 1 N1  3  5  3 
#3.N1 3 N1  3  5  3 
#2.N2 2 N2  1  5  3 
#4.N2 4 N2  2  2  1 

Если данные были:

dat <- structure(list(Sub = 1:4, `item1-N1` = c(3L, NA, 3L, NA), `item2-N1` = c(5L, 
NA, 5L, NA), `item3-N1` = c(3L, NA, 3L, NA), `item1-N2` = c(NA, 
1L, NA, 2L), `item2-N2` = c(NA, 5L, NA, 2L), `item3-N2` = c(NA, 
3L, NA, 1L)), .Names = c("Sub", "item1-N1", "item2-N1", "item3-N1", 
"item1-N2", "item2-N2", "item3-N2"), row.names = c(NA, -4L), class = "data.frame 
Смежные вопросы