我有一个如下所示的数据框:
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'))
答案 0 :(得分:2)
不可否认,我并不完全了解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
答案 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