我从mysql加载我的数据,它有两列: id、rt
在实践中,id对应于许多rts (我的设计不佳的表):
id rt
1 5129052 2
2 5129052 2
3 5129052 5
4 5129052 6
5 7125052 0
6 7125052 1
7 7125052 2
8 7125052 4
9 7125052 6
10 7125052 7我想创建一个像下面这样的数据透视表。第一列只是行数,没有什么特别的。
5129052 7125052
1 2 0
2 2 1
3 5 2
4 6 4
5 NA 6
6 NA 7如果可能,还会按升序对值进行排序。
谢谢!
发布于 2013-07-11 01:14:02
抱歉,但我发现这里的大多数答案有点夸张。这里还有两个建议。两者都依赖于创建第二个" id“,它表示存在于现有id的值的数量。
## Create a secondary "id"
df$id2 <- ave(as.character(df$id), df$id, FUN = seq_along)
df ## Your new "df"
id rt id2
1 5129052 2 1
2 5129052 2 2
3 5129052 5 3
4 5129052 6 4
5 7125052 0 1
6 7125052 1 2
7 7125052 2 3
8 7125052 4 4
9 7125052 6 5
10 7125052 7 6选项1: Base R的reshape
如果需要,只需清理变量名,就可以了。
reshape(df, direction = "wide", idvar = "id2", timevar = "id")
id2 rt.5129052 rt.7125052
1 1 2 0
2 2 2 1
3 3 5 2
4 4 6 4
9 5 NA 6
10 6 NA 7选项2:来自"reshape2“的dcast
更清晰的语法和更清晰的输出。
library(reshape2)
dcast(df, id2 ~ id, value.var="rt")
id2 5129052 7125052
1 1 2 0
2 2 2 1
3 3 5 2
4 4 6 4
5 5 NA 6
6 6 NA 7关于你的奖金问题?这两个解决方案都输出一个常规的data.frame,因此可以直接在它们上使用write.csv。
发布于 2013-06-19 05:00:00
你的答案一定要是矩阵吗?因为在这种情况下,矩阵对我来说没有多大意义。列表似乎是一个更实用的解决方案,允许每个id的rt向量的长度不同。例如:
lapply(split(df$rt, df$id), sort)发布于 2013-06-19 16:21:08
使用Jean V.Adams提供的内容,您可以使用以下内容从该数据帧创建数据帧。
dat <- read.table(text= " id rt
1 5129052 2
2 5129052 2
3 5129052 5
4 5129052 6
5 7125052 0
6 7125052 1
7 7125052 2
8 7125052 4
9 7125052 6
10 7125052 7",header=TRUE,sep="")
tmp <- split(dat$rt,dat$id,sort)
res <- sapply(tmp,function(x) { c(x,rep(NA,maxl - length(x)))})https://stackoverflow.com/questions/17177661
复制相似问题