在R中转换data.frame

在R中转换data.frame,r,dataframe,transform,R,Dataframe,Transform,我有以下数据框: foo <- data.frame( abs( cbind(rnorm(3),rnorm(3, mean=.8),rnorm(3, mean=.9),rnorm(3, mean=1)))) colnames(foo) <- c("w","x","y","z") rownames(foo) <- c("n","q","r") foo # w x y z # n 1.51550092 1.433

我有以下数据框:

foo <- data.frame( abs( cbind(rnorm(3),rnorm(3, mean=.8),rnorm(3, mean=.9),rnorm(3, mean=1))))
colnames(foo) <- c("w","x","y","z")
rownames(foo) <- c("n","q","r")
foo
#            w         x         y         z
# n 1.51550092 1.4337572 1.2791624 1.1771230
# q 0.09977303 0.8173761 1.6123402 0.1510737
# r 1.17083866 1.2469347 0.8712135 0.8488029
怎么做?

重塑2:::melt()特别适合此转换:

library(reshape2)

foo <- cbind(ID=rownames(foo),  foo)
melt(foo)
# Using ID as id variables
#    ID variable     value
# 1   n        w 1.7337416
# 2   q        w 0.5890877
# 3   r        w 0.2245508
# 4   n        x 0.5237346
# 5   q        x 0.9320455
# 6   r        x 0.8156573
# 7   n        y 1.9287306
# 8   q        y 1.1604229
# 9   r        y 1.7631215
# 10  n        z 0.3591350
# 11  q        z 0.9740170
# 12  r        z 0.5621968
library(重塑2)
foo有几种方法可以做到这一点。这里有一个:

set.seed(1)
foo <- data.frame( abs( cbind(rnorm(3),
                              rnorm(3, mean=.8),
                              rnorm(3, mean=.9),
                              rnorm(3, mean=1))))
colnames(foo) <- c("w","x","y","z")
rownames(foo) <- c("n","q","r")
foo
#           w          x        y         z
# n 0.6264538 2.39528080 1.387429 0.6946116
# q 0.1836433 1.12950777 1.638325 2.5117812
# r 0.8356286 0.02046838 1.475781 1.3898432
data.frame(rows = row.names(foo), stack(foo))
#    rows     values ind
# 1     n 0.62645381   w
# 2     q 0.18364332   w
# 3     r 0.83562861   w
# 4     n 2.39528080   x
# 5     q 1.12950777   x
# 6     r 0.02046838   x
# 7     n 1.38742905   y
# 8     q 1.63832471   y
# 9     r 1.47578135   y
# 10    n 0.69461161   z
# 11    q 2.51178117   z
# 12    r 1.38984324   z
set.seed(1)

foo你的标题提到了“矩阵”,但你的问题提到了“data.frame”。你到底在用什么?哎呀。对不起,我改了标题。这是DF。你不需要在这里使用
rep
(由于向量回收)。+1这似乎是最好的答案,因为它很短,不需要额外的包。这对我不起作用。我的名字是一样的。我的意思是我的df总共有6个col,但只有两种类型的名称
控制
治疗
。当我像你提到的那样融化时,我得到了重复的值。
set.seed(1)
foo <- data.frame( abs( cbind(rnorm(3),
                              rnorm(3, mean=.8),
                              rnorm(3, mean=.9),
                              rnorm(3, mean=1))))
colnames(foo) <- c("w","x","y","z")
rownames(foo) <- c("n","q","r")
foo
#           w          x        y         z
# n 0.6264538 2.39528080 1.387429 0.6946116
# q 0.1836433 1.12950777 1.638325 2.5117812
# r 0.8356286 0.02046838 1.475781 1.3898432
data.frame(rows = row.names(foo), stack(foo))
#    rows     values ind
# 1     n 0.62645381   w
# 2     q 0.18364332   w
# 3     r 0.83562861   w
# 4     n 2.39528080   x
# 5     q 1.12950777   x
# 6     r 0.02046838   x
# 7     n 1.38742905   y
# 8     q 1.63832471   y
# 9     r 1.47578135   y
# 10    n 0.69461161   z
# 11    q 2.51178117   z
# 12    r 1.38984324   z