没有 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