свернуть фрейм данных 2-col, где col1 содержит имена, col2 содержит значения

#r #tidyverse

#r #tidyverse

Вопрос:

Я думаю, что должен быть простой способ свернуть таблицу ввода, чтобы получить желаемую таблицу вывода, но я закрываю ее.

 library(tidyverse)
input <- tribble(
  ~name, ~value,
  "animal", "pig",
  "animal", "dog",
  "animal", "cat",
  "plant", "tree",
  "plant", "bush",
  "plant", "flower"
)

output <- tribble(
  ~animal, ~plant,
  "pig", "tree",
  "dog", "bush",
  "cat", "flower"
)
  

В input , col1 содержит метку переменной для каждого значения в col2. В output таблица переформатирована таким образом, что значения в input$value отображаются в столбцах, названных в соответствии с соответствующими элементами в input$name .

Ответ №1:

Мы можем использовать unstack from base R (пакеты не используются)

 unstack(input, value ~ name)
#   animal  plant
#1    pig   tree
#2    dog   bush
#3    cat flower
  

Или с dcast из data.table

 library(data.table)
dcast(input, rowid(name)~ name)[,-1]
#    animal  plant
#1    pig   tree
#2    dog   bush
#3    cat flower
  

Или с помощью dplyr

 library(dplyr)
input %>% 
    group_split(name, keep = FALSE) %>% 
    bind_cols
  

Или с помощью split

 split(input$value, input$name) %>% 
         bind_cols
  

Или другой вариант с spread

 library(tidyr)
input %>%
   mutate(rn = rowid(name)) %>% 
   spread(name, value)
  

Ответ №2:

Мы можем создать row_number() для каждого name , а затем spread

 library(dplyr)
library(tidyr)

input %>%
  group_by(name) %>%
  mutate(row = row_number()) %>%
  spread(name, value) %>%
  select(-row)

#   animal plant 
#  <chr>  <chr> 
#1  pig    tree  
#2  dog    bush  
#3  cat    flower