首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分散多列[tidyr]

分散多列[tidyr]
EN

Stack Overflow用户
提问于 2016-02-10 17:05:45
回答 1查看 3.6K关注 0票数 3

我希望使用tidyr将数据分散到多个列上。

代码语言:javascript
复制
  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"))

预期结果是:

代码语言:javascript
复制
Out <- data.frame(t(c(1,letters[seq(1,8)],"5","value")),row.names=NULL)
colnames(Out) <- c("ID",LETTERS[seq(1,10)])

我想出了:

代码语言:javascript
复制
a <- dat %>% gather(variable, value, -(ID:col1)) %>% 
     unite(temp, col1, variable) %>% 
     spread(temp, value)
a[,-which(is.na(a))]

这很笨拙,而且还会更改列名。有什么更好的解决办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-10 17:08:09

我们可以在na.rm=TRUE中使用gather,删除select中的“变量”并使用spread

代码语言:javascript
复制
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

代码语言:javascript
复制
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,类似的选项是

代码语言:javascript
复制
library(reshape2)
dcast(melt(dat, measure = 3:5, na.rm=TRUE),
                      ID~col1, value.var='value')
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35321497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档