答:pivot_wider()。如何将它扩展到两列

R: pivot_wider() . how to extend it to two columns

我找不到以前的答案来帮助我解决以下问题。

我有一个如下所示的数据框:

example_df <- tibble::tribble(
  ~ COMPANY, ~ ATTRIBUTE_NAME_1 , ~ ATTRIBUTE_VALUE_1, ~ATTRIBUTE_NAME_2, ~ATTRIBUTE_VALUE_2,
  'ACME', 'P/E' , '200', 'BV' , '200M',
  'Stark Ind', 'P/E' , '300', 'MKT CAP', '3000M')

我想将它分成两列,一列名为“ATTRIBUTE_NAME”,另一列名为“ATTRIBUTE_VALUE”。我该怎么做? -- 更长的常规枢轴不起作用。感谢任何帮助。

result_df <- tibble::tribble(
  ~ COMPANY, ~ ATTRIBUTE_NAME, ~ATTRIBUTE_VALUE,
  'ACME', 'P/E', '200',
  'ACME', 'BV', '200M',
  'Stark Ind', 'P/E', '300',
  'Stark Ind', 'MKT CAP', '3000M')

它需要 2 个独立的步骤。您可以尝试以下方法:

library(tidyverse)

a <- example_df %>% select(COMPANY, contains("NAME")) %>%
  pivot_longer(contains("NAME"), names_to = "IND", values_to = "ATTRIBUTE_NAME") %>% select(-IND)

b <- example_df %>% select(COMPANY, contains("VALUE")) %>% 
  pivot_longer(contains("VALUE"), names_to = "IND", values_to = "ATTRIBUTE_VALUE") %>% select(-IND)

bind_cols(a, b %>% select(-COMPANY))

旋转小插图是一个有用的指南:https://tidyr.tidyverse.org/articles/pivot.html

library(tidyr)

pivot_longer(example_df, -COMPANY, 
             names_to = c(".value", NA),
             names_pattern = "(.*)_(1|2)$")

# A tibble: 4 x 3
  COMPANY   ATTRIBUTE_NAME ATTRIBUTE_VALUE
  <chr>     <chr>          <chr>          
1 ACME      P/E            200            
2 ACME      BV             200M           
3 Stark Ind P/E            300            
4 Stark Ind MKT CAP        3000M