r - 基于多个变量创建长格式数据框
问题描述
我有一个大致如下所示的数据框:
my_data <- tribble(
~Main, ~VAR1a, ~VAR1b, ~VAR1c, ~VAR2a, ~VAR2b, ~VAR2c,
"A", "B", "C", "D", 1, 1, 1,
"B", "A", "D", "", 1, 2, NA,
"C", "D", "A", "", 2, 1, NA
)
# A tibble: 3 x 7
Main VAR1a VAR1b VAR1c VAR2a VAR2b VAR2c
<chr> <chr> <chr> <chr> <dbl> <dbl> <dbl>
1 A B C "D" 1 1 1
2 B A D "" 1 2 NA
3 C D A "" 2 1 NA
我想根据 、 和 将这个数据框旋转更长VAR1a
的VAR1b
时间VAR1c
。这很容易做到:
my_data %>%
pivot_longer(names_to = c("VAR1"),
cols = c("VAR1a", "VAR1b", "VAR1c"))
# A tibble: 9 x 6
Main VAR2a VAR2b VAR2c VAR1 value
<chr> <dbl> <dbl> <dbl> <chr> <chr>
1 A 1 1 1 VAR1a "B"
2 A 1 1 1 VAR1b "C"
3 A 1 1 1 VAR1c "D"
4 B 1 2 NA VAR1a "A"
5 B 1 2 NA VAR1b "D"
6 B 1 2 NA VAR1c ""
7 C 2 1 NA VAR1a "D"
8 C 2 1 NA VAR1b "A"
9 C 2 1 NA VAR1c ""
然而,我的问题是,列VAR2a
、和与、VAR2b
和VAR2c
直接相关(因此,变量编号后的字母显示关联)。例如,是分配给的值等等。VAR1a
VAR1b
VAR1c
VAR2a
Main
VAR1a
理想情况下,我希望有这样的东西:
# A tibble: 9 x 4
Main value VAR1 VAR2
<chr> <chr> <chr> <dbl>
1 A "B" VAR1a 1
2 A "C" VAR1b 1
3 A "D" VAR1c 1
4 B "A" VAR1a 1
5 B "D" VAR1b 2
6 B "" VAR1c NA
7 C "D" VAR1a 2
8 C "A" VAR1b 1
9 C "" VAR1c NA
我不知道如何pivot_longer()
使用 tidyverse 或是否可以使用 tidyverse。
解决方案
你可以试试pivot_longer
——
tidyr::pivot_longer(my_data,
cols = starts_with('VAR'),
names_to = '.value',
names_pattern = '(VAR\\d+)')
# Main VAR1 VAR2
# <chr> <chr> <dbl>
#1 A "B" 1
#2 A "C" 1
#3 A "D" 1
#4 B "A" 1
#5 B "D" 2
#6 B "" NA
#7 C "D" 2
#8 C "A" 1
#9 C "" NA
推荐阅读
- rest - 如何在 C# 中通过 POST HttpWebRequest 发送 gz 文件
- javascript - 我的 combineReducers 中可以有一个带有 JavaScript Reducers 的 TypeScript Reducer 吗?
- npm - 我是否必须使用 Azure Artifacts 才能访问私有 NPM 包?
- python - 根据 pandas groupby 中的条件对列应用更改
- reactjs - Gatsby - 从博客内容中拆分项目内容
- c++ - 通用构造函数值
- r - 发送自动邮件时无法附加 csv 文件
- iptables - iptables 配置以允许特定的 IP 地址并阻止其余的
- javascript - Vue 样式化子组件表单和表单元素
- powershell - 通过 PS Add-VpnConnection 设置 L2tp 连接凭据 - 如何?