#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