r - 重组 R 中的多个列
问题描述
这是我的数据示例:
dat<-read.table(text=" id bx1 Z1A Z1B Z1C QR1 bx2 Z2A Z2B Z2C QR2
1 1 1 2 3 C 18 2 2 1 E
2 11 2 3 3 B 14 3 3 3 A
",header=TRUE)
我想得到下表:
id bx Z QR Score
1 1 Z1A C 1
1 1 Z1B C 2
1 1 Z1C C 3
1 18 Z2A E 2
1 18 Z2B E 2
1 18 Z2C E 1
2 11 Z1A B 2
2 11 Z1B B 3
2 11 Z1C B 3
2 14 Z2A A 3
2 14 Z2B A 3
2 14 Z2C A 3
假设我有更多的 bxs 和 Zs 并且我已经这样做了,但它不起作用。我想用 tidyverse 或其他包来做。我无法找到解决方案。
df1<-melt(dat, id.var= "id")
解决方案
在这种情况下,我们可以使用 a left_join
after 单独执行pivot_longer
library(dplyr)
library(tidyr)
library(stringr)
dat %>%
select(id, starts_with('Z')) %>%
pivot_longer(cols = starts_with('Z'), values_to = 'Score',
names_to = 'Z') %>%
group_by(id) %>%
mutate(group = as.character(as.integer(factor(str_remove(Z, "[A-Z]$"))))) %>%
left_join(dat %>%
select(id, matches('^[^Z]')) %>%
pivot_longer(cols = -id, names_to = c(".value", "group"),
names_pattern = "^([A-Za-z]+)([0-9]+)")) %>%
select(-group)
# A tibble: 12 x 5
# Groups: id [2]
# id Z Score bx QR
# <int> <chr> <int> <int> <fct>
# 1 1 Z1A 1 1 C
# 2 1 Z1B 2 1 C
# 3 1 Z1C 3 1 C
# 4 1 Z2A 2 18 E
# 5 1 Z2B 2 18 E
# 6 1 Z2C 1 18 E
# 7 2 Z1A 2 11 B
# 8 2 Z1B 3 11 B
# 9 2 Z1C 3 11 B
#10 2 Z2A 3 14 A
#11 2 Z2B 3 14 A
#12 2 Z2C 3 14 A
或者另一种选择是先做一个pivot_longer
然后fill
选择列
dat %>%
pivot_longer(cols = -id, names_to = c(".value", "group"),
names_pattern = "^([A-Za-z]+)([0-9]+[A-Z]?)") %>%
group_by(id) %>%
fill(bx, QR) %>%
ungroup %>%
filter(!is.na(Z)) %>%
rename_at(vars(Z, group), ~ c('Score', 'Z')) %>%
mutate(Z = str_c('Z', Z))
# A tibble: 12 x 5
# id Z bx Score QR
# <int> <chr> <int> <int> <fct>
# 1 1 Z1A 1 1 C
# 2 1 Z1B 1 2 C
# 3 1 Z1C 1 3 C
# 4 1 Z2A 18 2 E
# 5 1 Z2B 18 2 E
# 6 1 Z2C 18 1 E
# 7 2 Z1A 11 2 B
# 8 2 Z1B 11 3 B
# 9 2 Z1C 11 3 B
#10 2 Z2A 14 3 A
#11 2 Z2B 14 3 A
#12 2 Z2C 14 3 A
推荐阅读
- reactjs - 如何在本机反应中全局处理错误?
- java - 使用来自 apache sshd 的 ssh 设置 ssh 密钥以与 jgit 一起使用
- or-tools - OR-Tools:一个 IntVar 是一个 IntVar 减去 Java 中的另一个 IntVar?
- android - 使用协程的 Firestore 快照?
- vue.js - 如何正确使用 Vue 上的选项卡旁边的路由器视图来根据活动选项卡更改 url?
- laravel - 当我尝试动态构建查询时,Laravel 查询构建器和 Eloquent 查询构建器添加了一个奇怪的短语?
- c# - 为什么它总是将日期中的时间保存到数据库中为零 C#
- angular - 如何在 Angular 中生成循环库
- android - 片段内的 YoutubePlayerFragment
- python - 如何知道 Python 中当前使用的是哪个 GPU 设备?