更改R中的数据框

时间:2011-04-08 00:12:12

标签: r

我在for循环中生成了一个数据框,并具有此结构

    V1 V2 V3
1   a  a  1
2   a  b  3
3   a  c  2
4   a  d  1
5   a  e  3
6   b  a  3
7   b  b  1
8   b  c  8
9   b  d  1
10  b  e  1
11  c  a  2
12  c  b  8

数据比这长,但这就是我想要的想法 (将其转换为宽表[V1 by V2])

V3是基于(V1,V2)的值

我想将数据重新排列为这样(第一列是V1的唯一,第一行是V2的唯一,它们之间的数据来自V3)

  a b c d e
a 1 3 2 1 3
b 3 1 8 1 1
c 2 8 2 8 2
d 1 1 5 7 2
e 3 5 9 5 3
提前thnx。

3 个答案:

答案 0 :(得分:1)

你的可重复的例子:

df <- structure(list(V1 = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L), .Label = c("a", "b", "c"), class = "factor"),     V2 = structure(c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L), .Label = c("a", "b", "c", "d", "e"), class = "factor"),     V3 = c(1L, 3L, 2L, 1L, 3L, 3L, 1L, 8L, 1L, 1L, 2L, 8L)), .Names = c("V1", "V2", "V3"), class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"))

根据您的变量计算基本的交叉:

> xtabs(V3~V1+V2, df)
   V2
V1  a b c d e
  a 1 3 2 1 3
  b 3 1 8 1 1
  c 2 8 0 0 0

我希望你的意思是这个:)

答案 1 :(得分:0)

如果df是您的数据框,假设一个唯一的V3映射到每个V1,V2组合,您可以使用

with(df, tapply(V3, list(V1,V2), identity))

答案 2 :(得分:0)

另一种方法,可能略微更为巴洛克式,用于在前两个基础上从第三列扩展数据帧......与Chase一起,OP没有给出明确的问题描述:

 df2 <- expand.grid(A=LETTERS[1:5], B=LETTERS[1:5])
 df2$N <- 1:25
 mtx <- outer(X=LETTERS[1:5],Y=LETTERS[1:5], FUN=function(x,y){
                        df2[intersect(which(df2$A==x), which(df2$B==y)), "N"] })
 colnames(mtx)<-LETTERS[1:5]; rownames(mtx)<-LETTERS[1:5]
 mtx
  A  B  C  D  E
A 1  6 11 16 21
B 2  7 12 17 22
C 3  8 13 18 23
D 4  9 14 19 24
E 5 10 15 20 25

我确信还有许多其他策略在基础中使用reshape或在reshape2中使用dcast