r - 我需要将宽表重塑为长格式,但为每条记录保留多个字段,例如:
问题描述
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
我对熔化和重塑有基本的了解,但无法想象如何利用这些功能获得所需的输出。
解决方案
您本质上想要收集所有列,按每一行分组。然后期待前导值,以及最后一个值。所以在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)
推荐阅读
- kubernetes - 在 Kubernetes (GKE) 上创建 cockroachdb 用户证书的最后一步
- html - 定位 CSS 列布局中的特定列
- graphql - 在短 GraphQL 查询上返回 null
- reactjs - 带有 express 后端的 Create-react-app 在本地工作,但在部署到 heroku 时路由不正确
- ruby - 只要有更多内容要显示,Watir 就会向下滚动页面
- java - 在验证多个 URL 时无法在 java 中找到请求目标的有效证书路径
- javascript - D3 forceX/forceY 和 forceCenter 的区别
- python - 使用 asyncio 创建两个并发异步任务
- c++ - 为什么顶点数组对象会导致错误?
- django - Django遗留数据库迁移多对多中间表