分散多列[tidyr] [英] Spread multiple columns [tidyr]

查看:64
本文介绍了分散多列[tidyr]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用 tidyr 将数据分布在多列中。

I would like to spread data over multiple columns using 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))]

笨拙,还会更改列名。

which is clumsy and also changes the column names. Is there a better solution for this?

推荐答案

我们可以使用 na.rm = TRUE 收集中,使用 select 删除变量,并使用 spread

We can use the na.rm=TRUE in gather, remove the 'variable' with select and use 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



更新



使用 tidyr tidyr_0.8.3.9000 )的开发版本,我们可以使用 pivot_wider 当要考虑多个值列时

Update

With the devel version of tidyr (tidyr_0.8.3.9000), we can use pivot_wider when there are multiple value columns to be considered

dat %>%
  pivot_wider(names_from = col1, values_from = str_c("col", 2:4)) %>% 
  select_if(~ any(!is.na(.)))
# A tibble: 1 x 11
#     ID col2_A col2_B col2_C col2_D col2_E col2_F col2_G col2_H col3_I col4_J
#  <dbl> <fct>  <fct>  <fct>  <fct>  <fct>  <fct>  <fct>  <fct>  <fct>  <fct> 
#1     1 a      b      c      d      e      f      g      h      5      value 






如果我们使用 reshape2 ,类似的选择是

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

这篇关于分散多列[tidyr]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆