我有一个只有一行的数据框。成对的列放在一起,其中一个包含名称,另一个包含值。因此,我想将名称和列组合从单行格式提取到堆叠格式,其中一列用于名称,第二列用于值。我正在尝试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
Run Code Online (Sandbox Code Playgroud)
var_name var_value
<chr> <dbl>
1 height 200
2 weight 400
3 length 1000
Run Code Online (Sandbox Code Playgroud)
df %>%
pivot_longer(cols = everything(),
names_to = ".value",
names_pattern = "var_[0-9]_(.*)")
## value
## <dbl>
## 1 200
## 2 400
## 3 1000
Run Code Online (Sandbox Code Playgroud)
我知道这是一个相当基本的问题,但我不知道如何解决这个问题,也没有找到类似的答案问题。谢谢!
按照现在的列名方式,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
Run Code Online (Sandbox Code Playgroud)
然后使用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
Run Code Online (Sandbox Code Playgroud)