Как создать столбец для каждого уровня другого столбца в R? - PullRequest
2 голосов
/ 20 февраля 2020

Цель, которую я пытаюсь достичь, - это расширенный фрейм данных, в котором я создам новый столбец для каждого уровня определенного столбца c в R. Вот пример исходного фрейма данных и фрейма данных Я пытаюсь достичь:

Исходный фрейм данных:

record           crop_land     fishing_ground
BiocapPerCap     1.5           3.4
Consumption      2.3           0.5

Фрейм данных цели:

crop_land.BiocapPerCap     crop_land.Consumption     fishing_ground.BiocapPerCap      fishing_ground.Consumption
1.5                        2.3                       3.4                              0.5

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Мы можем использовать pivot_wider из пакета tidyr следующим образом.

library(tidyr)
library(magrittr)

dat2 <- dat %>%
  pivot_wider(names_from = "record", values_from = c("crop_land", "fishing_ground"),
              names_sep = ".")
dat2
# # A tibble: 1 x 4
#   crop_land.BiocapPerCap crop_land.Consumption fishing_ground.BiocapPer~ fishing_ground.Consumpti~
#                    <dbl>                 <dbl>                     <dbl>                     <dbl>
# 1                    1.5                   2.3                       3.4                       0.5

ДАННЫЕ

dat <- read.table(text = "record           crop_land     fishing_ground
BiocapPerCap     1.5           3.4
Consumption      2.3           0.5",
                  header = TRUE, stringsAsFactors = FALSE)
0 голосов
/ 20 февраля 2020

Использование tidyr - один из вариантов.

tidyr::pivot_longer() преобразует crop_land и fishing_ground в пары переменная-значение. tidyr::unite() объединяет запись и переменную с новыми именами. tidyr::pivot_wider() создает широкий фрейм данных, который вам нужен.

library(tidyr)
library(magrittr) # for %>%

tst <-  data.frame(
  record = c("BiocapPerCap", "Consumption"), 
  crop_land = c(1.5, 2.3), 
  fishing_ground = c(3.4, 0.5)
)

pivot_longer(tst, -record) %>% 
  unite(new_name, record, name, sep = '.') %>% 
  pivot_wider(names_from = new_name, values_from = value)

...