2016-02-10 5 views
2

Я хотел бы распространять данные по нескольким столбцам, используя tidyr.Распространение нескольких столбцов [tidyr]

dat <- data.frame(ID = rep(1,10), 
    col1 = LETTERS[seq(1,10)], 
    col2 = c(letters[seq(1,8)],NA,NA), 
    col3 = c(rep(NA,8),"5",NA), 
    col4 = c(rep(NA,8),NA,"value")) 

Ожидаемый результат:

Out <- data.frame(t(c(1,letters[seq(1,8)],"5","value")),row.names=NULL) 
colnames(Out) <- c("ID",LETTERS[seq(1,10)]) 

я придумал:

a <- dat %>% gather(variable, value, -(ID:col1)) %>% 
    unite(temp, col1, variable) %>% 
    spread(temp, value) 
a[,-which(is.na(a))] 

который является неуклюжим, а также изменяет имена столбцов. Есть ли лучшее решение для этого?

ответ

6

Мы можем использовать na.rm=TRUE в gather, удалите 'переменная' с select и использовать spread

library(dplyr) 
library(tidyr) 
gather(dat, variable, val, -(ID:col1), na.rm=TRUE) %>% 
         select(-variable) %>% 
         spread(col1, val) 
# ID A B C D E F G H I  J 
#1 1 d b b c b b b a 5 value 

Если мы используем reshape2, подобный вариант

library(reshape2) 
dcast(melt(dat, measure = 3:5, na.rm=TRUE), 
         ID~col1, value.var='value') 
+1

Великий объяснение и решение, большое спасибо! – count

Смежные вопросы