2013-10-13 60 views
9

我甚至不知道如何标题的问题正确![R重新排列数据帧:一些行的列

假设我有一个数据帧d:

当前数据帧:

d <- data.frame(sample = LETTERS[1:2], cat = letters[11:20], count = c(1:10)) 

    sample cat count 
1  A k  1 
2  B l  2 
3  A m  3 
4  B n  4 
5  A o  5 
6  B p  6 
7  A q  7 
8  B r  8 
9  A s  9 
10  B t 10 

,我想重新安排你的事情,使得每只猫值变为它自己的专栏,样品仍然是一列(或成为行名称),计数将是价值在新的猫列,0,其中一个样本不具有猫的计数。像这样:

期望中的数据框布局:

sample k l m n o p q r s t 
1  A 1 0 3 0 5 0 7 0 9 0 
2  B 0 2 0 4 0 6 0 8 0 10 

什么是去了解它的最好方法?

这是据我已经得到:

for (i in unique(d$sample)) { 
    s <- d[d$sample==i,] 
    st <- as.data.frame(t(s[,3])) 
    colnames(st) <- s$cat 
    rownames(st) <- i 
} 

即通过在原始数据帧的样本循环和调换为每个样本子集。因此,在这种情况下,我得到

k m o q s 
A 1 3 5 7 9 

l n p r t 
B 2 4 6 8 10 

这是我卡住。我用merge(),bind(),apply()等方法尝试了一堆东西,但我似乎无法击中正确的东西。另外,我不禁想知道上面的这个循环是否是必要的步骤 - 也许是用unstack()的东西?

不用说,我是新至R ...如果有人能帮助我,这将不胜感激!

PS原因,我试图重新安排我的数据帧是在制作的价值更容易绘制的希望(即我要显示在表格式的阴谋实际DF)。

谢谢!

+0

你想要做的是从“长”到“宽”去操作。这个问题之前已经被问及过很多次了。 – nograpes

+1

我的歉意。我通过这里和谷歌搜索无尽的,我只是找不到任何我需要的东西(不知道如何调用我所需要的不是帮助)。我会寻找“长”/“宽”... – crs

回答

9

使用reshape从基R:

nn<-reshape(d,timevar="cat",idvar="sample",direction="wide") 
names(nn)[-1]<-as.character(d$cat) 
nn[is.na(nn)]<-0 
> nn 
    sample k l m n o p q r s t 
1  A 1 0 3 0 5 0 7 0 9 0 
2  B 0 2 0 4 0 6 0 8 0 10 
+0

谢谢,@Metrics - 这也可以! (现在我明白了nograpes在他的评论中所说的“长”和“宽”)。 Jilber的解决方案看起来更简洁 - 其他方面有什么不同?谢谢你的帮助!总是善于学习一些额外的东西。 – crs

+1

@crs,最大的区别是'xtabs'和'dcast'只能有一个“值”变量才能转换为宽格式。例如,在对原始“d”'data.frame':'d $ blah < - 11:20'进行一个小改动后,尝试使用Metrics代码的第一行。现在,试着用'dcast'或'xtabs'做同样的事情。使用'dcast',首先'熔化'你的数据之后可能会有类似的输出。使用'xtabs'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''必须分别地重塑变量并且'将它们连接在一起。 'reshape()'非常快,特别是与目前的'dcast'实现相比。 – A5C1D2H2I1M1N2O1R2T1

+1

度量标准:+1,但是我不知道是否会去重命名。在这种情况下,由于我在上面的评论中描述的扩展示例... – A5C1D2H2I1M1N2O1R2T1

12

从基本用dcast从reshape2包

> dcast(d, sample~cat, fill=0) 
    sample k l m n o p q r s t 
1  A 1 0 3 0 5 0 7 0 9 0 
2  B 0 2 0 4 0 6 0 8 0 10 

xtabs是另一种选择

> xtabs(count~sample+cat, d) 
     cat 
sample k l m n o p q r s t 
    A 1 0 3 0 5 0 7 0 9 0 
    B 0 2 0 4 0 6 0 8 0 10 

如果你喜欢的输出是一个data.frame,然后尝试:

> as.data.frame.matrix(xtabs(count~sample+cat, d)) 
    k l m n o p q r s t 
A 1 0 3 0 5 0 7 0 9 0 
B 0 2 0 4 0 6 0 8 0 10 
+0

他,这看起来很整齐。但是,我应该提到,我正在寻找一种方法在标准(基本)R中执行此操作(因为这不适用于我)。任何方式来做到这一点? (即使它更多参与?) – crs

+1

@crs看到我的编辑,我添加了R基础解决方案。 –

+1

哦,血腥的h,非常感谢你!!!!这就是它!我还不能投票,但保佑你的心:) – crs