r - 使用 tidyr::pivot_longer 转换单行数据框:获取列对并将它们堆叠
问题描述
我有一个单行数据框。成对的列放在一起,其中一个包含名称,另一个包含值。因此,我想将名称和列组合从 1 行格式提取为堆叠格式,其中一列用于名称,另一列用于值。我正在尝试pivot_longer
,但不知何故无法完成。
数据
library(tidyverse)
df <-
tribble(~ var_1, ~ var_1_value, ~ var_2, ~ var_2_value, ~ var_3, ~ var_3_value,
"height", 200, "weight", 400, "length", 1000)
> df
## var_1 var_1_value var_2 var_2_value var_3 var_3_value
## <chr> <dbl> <chr> <dbl> <chr> <dbl>
## 1 height 200 weight 400 length 1000
期望的输出
var_name var_value
<chr> <dbl>
1 height 200
2 weight 400
3 length 1000
我试过的
df %>%
pivot_longer(cols = everything(),
names_to = ".value",
names_pattern = "var_[0-9]_(.*)")
## value
## <dbl>
## 1 200
## 2 400
## 3 1000
我知道这是一个相当基本的问题,但我不知道如何解决这个问题,也没有找到类似的已回答问题。谢谢!
解决方案
pivot_longer
您现在拥有列名的方式,直接在此上使用并不容易。您可以更改列名称,如:
names(df) <- paste0(sub('_value', '', names(df)), c('_char', '_value'))
df
# A tibble: 1 x 6
# var_1_char var_1_value var_2_char var_2_value var_3_char var_3_value
# <chr> <dbl> <chr> <dbl> <chr> <dbl>
#1 height 200 weight 400 length 1000
然后使用pivot_longer
:
tidyr::pivot_longer(df,
cols = everything(),
names_to = ".value",
names_pattern = 'var_\\d+_(.*)')
# char value
# <chr> <dbl>
#1 height 200
#2 weight 400
#3 length 1000
推荐阅读
- python-3.x - 为什么在 `input().split()` 已经是列表时使用`list(map(str,input().split()))`
- glsl - webgl2.0我如何获得除uniformBuffer项目之外的所有制服
- c - 为什么平均计算程序在小数点后显示不同的结果?
- pandas - 基于第二帧的重复行
- c# - 将第二个参数传递给函数
- reactjs - 如何在本机反应中做曲线状动画?
- vuejs2 - 如何在@vue/cli 中添加 tno-unused-vars 错误
- asp.net - 将文件上传到 Azure 存储的 POST 方法 - 返回什么
- node.js - 如何确保请求来自浏览器而不是机器人
- python - 计算每行数据框中的搜索词