我在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。
答案 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
。