在R多列中转置数据帧

时间:2018-02-02 20:41:19

标签: r reshape transpose reshape2

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

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'))

2 个答案:

答案 0 :(得分:2)

不可否认,我并不完全了解data.tablereshape2有一些时髦的语法(至少在我看来)需要一些时间来学习。

我必须将您的数据框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

答案 1 :(得分:1)

好吧也许下次从基地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