没有 Null 的数据框
Pivot data frame without Null
我已经查看了所有类似的 Whosebug 问题,但没有成功。
考虑 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
我已经查看了所有类似的 Whosebug 问题,但没有成功。
考虑 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