Я рассмотрел все подобные вопросы о stackoverflow, но безуспешно.
Рассмотрим набор данных iris
. Я просто хочу поместить виды в виде столбцов и получить под названиями каждого вида только длину чашелистика.
Пока я получаю:
library("reshape2")
data(iris)
iris$ID <- 1:nrow(iris)
acast(iris,ID~Species,value.var = "Sepal.Length")
Результат почти такой, как я ожидал... За исключением всех NA
, которых здесь быть не должно (значения каждого столбца должны быть сдвинуты до того, что мы получим только 50 строк для всего фрейма данных).
Вот пара вариантов -
library(dplyr)
library(tidyr)
iris %>%
select(Species, Sepal.Length) %>%
group_by(Species) %>%
mutate(row = row_number()) %>%
pivot_wider(names_from = Species, values_from = Sepal.Length) %>%
select(-row)
# setosa versicolor virginica
# <dbl> <dbl> <dbl>
# 1 5.1 7 6.3
# 2 4.9 6.4 5.8
# 3 4.7 6.9 7.1
# 4 4.6 5.5 6.3
# 5 5 6.5 6.5
# 6 5.4 5.7 7.6
# 7 4.6 6.3 4.9
# 8 5 4.9 7.3
# 9 4.4 6.6 6.7
#10 4.9 5.2 7.2
# … with 40 more rows
data.table
-
library(data.table)
df <- iris
dcast(setDT(df), rowid(Species)~Species, value.var = "Sepal.Length")
Другое возможное решение:
library(tidyverse)
iris %>%
select(Sepal.Length, Species) %>%
pivot_wider(names_from = Species, values_from = Sepal.Length, values_fn = list) %>%
unnest(everything())
#> # A tibble: 50 × 3
#> setosa versicolor virginica
#> <dbl> <dbl> <dbl>
#> 1 5.1 7 6.3
#> 2 4.9 6.4 5.8
#> 3 4.7 6.9 7.1
#> 4 4.6 5.5 6.3
#> 5 5 6.5 6.5
#> 6 5.4 5.7 7.6
#> 7 4.6 6.3 4.9
#> 8 5 4.9 7.3
#> 9 4.4 6.6 6.7
#> 10 4.9 5.2 7.2
#> # … with 40 more rows