首页 > 解决方案 > 将 pivot_longer 与现有的 names_to 列一起使用

问题描述

以这样的示例数据框为例(真实的数据框有更多列):

df <- data.frame(A = seq(1, 3, 1),
                 B = seq(4, 6, 1))

我可以像这样pivot_longer收集我感兴趣的列(AB):

library(dplyr)
library(tidyr)
df <- df %>% 
  pivot_longer(cols = c("A", "B"), names_to = "Letter", values_to = "Number")
df
  Letter Number
  <chr>   <dbl>
1 A           1
2 B           4
3 A           2
4 B           5
5 A           3
6 B           6

现在假设C我的数据框中有另一列,使其不再整洁

C <- seq(7, 12, 1)

df_2 <- data.frame(df, C)
df_2
  Letter Number  C
1      A      1  7
2      B      4  8
3      A      2  9
4      B      5 10
5      A      3 11
6      B      6 12

我想pivot_longer再次使用来df_2整理并获得以下输出:

data.frame(Letter = c(rep("A", 3), rep("B", 3), rep("C", 3)),
                        Number = seq(1, 12, 1))
   Letter Number
1       A      1
2       A      2
3       A      3
4       B      4
5       B      5
6       B      6
7       C      7
8       C      8
9       C      9
10      C     10
11      C     11
12      C     12

但是,使用相同的策略会产生错误:

df_2 %>% 
  pivot_longer(cols = "C", names_to = "Letter", values_to = "Number")
Error: Failed to create output due to bad names.
* Choose another strategy with `names_repair`

设置names_repairminimal运行但不会产生我想要的输出。

标签: rtidyr

解决方案


像这样跟随

library(tidyverse)
df <- data.frame(A = seq(1, 3, 1),
                 B = seq(4, 6, 1))
df <- df %>% 
  pivot_longer(cols = c("A", "B"), names_to = "Letter", values_to = "Number")

C <- seq(7, 12, 1)
df_2 <- data.frame(C)
df_2 <- df_2 %>% pivot_longer(cols = C, names_to = "Letter", values_to = "Number")

df_result <- rbind(df, df_2)

输出

> df_result
# A tibble: 12 x 2
   Letter Number
   <chr>   <dbl>
 1 A           1
 2 B           4
 3 A           2
 4 B           5
 5 A           3
 6 B           6
 7 C           7
 8 C           8
 9 C           9
10 C          10
11 C          11
12 C          12

推荐阅读