从具有因子列和数字列的数据框到具有因子水平作为列和相应数值作为行的数据框

Going from a dataframe with a factor column and numeric column to a dataframe with factor levels as columns and corresponding numeric values as rows

如果我采用以下两列数据框,其中一列是因子,另一列是数字向量:

data <- data.frame(x=c("a","b","c","d","e","f","g","h"), y = c(1,2,3,3,2,1,5,6))
data$x <- as.factor(data$x)

我怎样才能把它变成一个新的数据框 data2,其中 data$x 的因子水平是列,行包含 data$y 中的相应数值,就像这样?

structure(list(a = 1, b = 2, c = 3, d = 3, e = 2, f = 1, g = 5, 
    h = 6), class = "data.frame", row.names = c(NA, -1L))

对于基数 R,使用 rbind.data.frame:

d <- rbind.data.frame(data$y)
colnames(d) <- data$x

  a b c d e f g h
1 1 2 3 3 2 1 5 6

pivot_wider:

tidyr::pivot_wider(data, names_from = x, values_from = y)

      a     b     c     d     e     f     g     h
1     1     2     3     3     2     1     5     6

xtabs:

xtabs(y ~ ., data = data) |> 
    as.data.frame.list()

  a b c d e f g h
1 1 2 3 3 2 1 5 6

另一个可能的解决方案,使用 data.table::transpose:

data.table::transpose(data, make.names = 1)

#>   a b c d e f g h
#> 1 1 2 3 3 2 1 5 6

另一个使用 sjmisc 包的选项:

library(sjmisc)

data %>% 
   rotate_df(cn = T)

#  a b c d e f g h
#y 1 2 3 3 2 1 5 6