首页 > 解决方案 > 我需要将宽表重塑为长格式,但为每条记录保留多个字段,例如:

问题描述

src   hop1   hop2   hop3    hop4    destination
 A     B      C      NA      NA      NA
 P     Q      R      S       NA      NA
 H     I      J      K       L       M

现在我想把这张桌子融化成下面的格式

src nn en
 A  B  C
 B  C  C
 P  Q  S
 Q  R  S
 R  S  S
 H  I  M
 I  J  M
 J  K  M
 K  L  M
 L  M  M

我对熔化和重塑有基本的了解,但无法想象如何利用这些功能获得所需的输出。

标签: r

解决方案


您本质上想要收集所有列,按每一行分组。然后期待前导值,以及最后一个值。所以在dplyr中是这样的:

dat %>%
  mutate(row=row_number()) %>%
  gather(key, src, -row) %>%
  drop_na() %>%
  group_by(row) %>%
  mutate(nn=lead(src), en=last(src)) %>%
  ungroup() %>%
  filter(!is.na(nn)) %>%
  arrange(row) %>%
  select(src, nn, en)

## A tibble: 10 x 3
#   src   nn    en   
#   <chr> <chr> <chr>
# 1 A     B     C    
# 2 B     C     C    
# 3 P     Q     S    
# 4 Q     R     S    
# 5 R     S     S    
# 6 H     I     M    
# 7 I     J     M    
# 8 J     K     M    
# 9 K     L     M    
#10 L     M     M 

或者像这样在基础 R 中:

tmp <- na.omit(data.frame(row=seq_len(nrow(dat)), src=unlist(dat), stringsAsFactors=FALSE))
tmp$nn <- ave(tmp$src, tmp$row, FUN=function(x) c(tail(x,-1),NA) )
tmp$en <- ave(tmp$src, tmp$row, FUN=function(x) tail(x,1) )
tmp <- tmp[!is.na(tmp$nn),]
tmp[order(tmp$row), c("src","nn","en")]

#      src nn en
#src1    A  B  C
#hop11   B  C  C
#src2    P  Q  S
#hop12   Q  R  S
#hop22   R  S  S
#src3    H  I  M
#hop13   I  J  M
#hop23   J  K  M
#hop33   K  L  M
#hop43   L  M  M

在哪里dat

dat <- read.table(text="src   hop1   hop2   hop3    hop4    destination
 A     B      C      NA      NA      NA
 P     Q      R      S       NA      NA
 H     I      J      K       L       M", header=TRUE, stringsAsFactors=FALSE)

推荐阅读