传播多个列[tidyr]

时间:2016-02-10 17:05:45

标签: r dplyr 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))]

这是笨拙的,也会更改列名。对此有更好的解决方案吗?

1 个答案:

答案 0 :(得分: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')