使用 R 数据帧进行多列透视/转置

问题描述 投票:0回答:2

我有这个数据框:

my_df = tibble(name = c('year','month','car', 'mileage', 'price'), unk_1 = c('2020','January','toyota', '1000', '$200'), unk_2 = c('2024', 'February', 'hyundai', '50', '$100'))

我如何转置两列 - 或使用pivot_longer()来获取以下数据框:

new_df = tibble('car' = c('toyota', 'hyundai'), 'mileage' = c('1000', '50'), year = c('2022', '2024'), month = c('January', 'February'), price = c('$200', '$100'))

数据透视或转置应有效地包含月份和年份行。

我已经尝试过 data.table 和pivot_longer() 但仍然卡住了。

r dataframe dplyr data.table tidyverse
2个回答
0
投票

您可以先获取长格式的数据,然后再将其转换为宽格式。

library(dplyr)
library(tidyr)


my_df %>%
  pivot_longer(cols = -name, names_to = "col") %>%
  pivot_wider(names_from = name, values_from = value) %>%
  select(-col) %>%
  readr::type_convert()

# A tibble: 2 × 5
#   year month    car     mileage price
#  <dbl> <chr>    <chr>     <dbl> <chr>
#1  2020 January  toyota     1000 $200 
#2  2024 February hyundai      50 $100 

0
投票

试试这个:

library(tidyr)
library(dplyr)

my_df <- tibble(
    name = c('year', 'month', 'car', 'mileage', 'price'),
    unk_1 = c('2020', 'January', 'toyota', '1000', '$200'),
    unk_2 = c('2024', 'February', 'hyundai', '50', '$100')
)

首先使用“透视更长”和“透视更宽”功能重塑数据,并仅保留感兴趣的列

final_df <- my_df %>%
    pivot_longer(cols = starts_with("unk_"), names_to = "unk", values_to = "value") %>%
    pivot_wider(names_from = name, values_from = value)  %>%
    select(car, mileage, year, month, price)

final_df

这给了我:

  # A tibble: 2 × 5
  car     mileage year  month    price
  <chr>   <chr>   <chr> <chr>    <chr>
1 toyota  1000    2020  January  $200 
2 hyundai 50      2024  February $100 
© www.soinside.com 2019 - 2024. All rights reserved.