将长数据框转换为宽数据框

3

我将尝试在R中将长数据形式转换为宽数据形式。例如,我有以下数据框:

a = rep(c("A","B","C","D"),4)
b = rep(c("COL1","COL2","COL3","COL4"),4)
val = 101:116
df = as.data.frame(cbind(a,b,val))
df

我希望看到的结果如下:

row <- as.list(levels(df$a))
col <- as.list(levels(df$b))

test <- data.frame()

i = 1

  for (j in 1:4) {
    for(k in 1:4){
      test[j,k]  =   df$val[i]
      i = i + 1 
    }
  }

colnames(test) <- c("COL1","COL2","COL3","COL4")
rownames(test) <- c("A","B","C","D")
test

希望您能使用一些便利的函数提供一个优雅的解决方案。

谢谢,Qasim

2个回答

3

使用 unstack

df.out <- unstack(df, val ~ b)
rownames(df.out) <- unique(df$a)

使用reshape2,需要一些技巧来获取一个id列,因为你的标识符不能唯一地标识这些值。
dcast(transform(df, id=rep(1:4, each=4)), id ~ b, value.var="val")

您可以类似地添加行名称。

3
如果您的id列确实是唯一的,您可以使用reshape。
reshape(data=df, direction = "wide", idvar = "a", timevar = "b", v.names = "val")

但是由于它们并不是唯一的,下面的内容将指导您正确地进行操作。
df$fakeid <- rep(1:4, each=4)
reshape(data=df, direction = "wide", idvar = "fakeid", drop = "a", timevar = "b", v.names = "val")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接