在 R 多列中转置数据框

Transpose dataframe in R multiple columns

我有一个如下所示的数据框:

x <- c('Jim', 'Jim', 'Jim', 'Sue', 'Sue', 'Sue')
y <- c(100, 200, 150, 40, 50, 30)
z <- c(5, 6, 4, 3, 4, 4)
num <- c(1, 2, 3, 1, 2, 3)

df <- data.frame(x,y,z,num)

我需要转置它,这样我就有一行给吉姆,一行给苏,值为 y1、y2、y3、z1、z2、z3。

我知道如何使用 data.table::dcast 执行此操作,但我使用的 Linux 服务器无法加载此包。因此,我正在尝试使用 reshape 包甚至只是 reshape() 函数来实现它,但是 运行 遇到了困难。

# This gives the desired result
df1 <- data.table::dcast(setDT(df), x ~ num, value.var=c('y', 'z'))

# Trying to figure out what I'm missing here...
df2 <- reshape::cast(df, num ~ x, value = c('y', 'z'))

诚然,我对 data.table 不是很了解,并且 reshape2 有一些时髦的语法(至少在我看来是这样)需要一些时间来学习。

我不得不 melt() 将您的数据框转换为更好的格式,然后使用 dcast() 获得最终输出。

library(reshape2)

> df %>%
+   melt(id.vars = c("x", "num"), measure.vars = c("y", "z")) %>%
+   dcast(x ~ paste0(.$variable, .$num), value.var = "value")
    x  y1  y2  y3 z1 z2 z3
1 Jim 100 200 150  5  6  4
2 Sue  40  50  30  3  4  4

好吧,也许下次使用来自 base r:

aggregate
 aggregate(.~x,df[-4],I)
    x y.1 y.2 y.3 z.1 z.2 z.3
1 Jim 100 200 150   5   6   4
2 Sue  40  50  30   3   4   4