首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的数据透视表不均匀(列的长度)

R中的数据透视表不均匀(列的长度)
EN

Stack Overflow用户
提问于 2013-06-19 03:50:52
回答 5查看 995关注 0票数 3

我从mysql加载我的数据,它有两列: id、rt

在实践中,id对应于许多rts (我的设计不佳的表):

代码语言:javascript
复制
      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

我想创建一个像下面这样的数据透视表。第一列只是行数,没有什么特别的。

代码语言:javascript
复制
     5129052 7125052
  1    2       0
  2    2       1
  3    5       2
  4    6       4
  5   NA       6
  6   NA       7

如果可能,还会按升序对值进行排序。

谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-07-11 01:14:02

抱歉,但我发现这里的大多数答案有点夸张。这里还有两个建议。两者都依赖于创建第二个" id“,它表示存在于现有id的值的数量。

代码语言:javascript
复制
## 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

如果需要,只需清理变量名,就可以了。

代码语言:javascript
复制
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

更清晰的语法和更清晰的输出。

代码语言:javascript
复制
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

票数 2
EN

Stack Overflow用户

发布于 2013-06-19 05:00:00

你的答案一定要是矩阵吗?因为在这种情况下,矩阵对我来说没有多大意义。列表似乎是一个更实用的解决方案,允许每个idrt向量的长度不同。例如:

代码语言:javascript
复制
lapply(split(df$rt, df$id), sort)
票数 5
EN

Stack Overflow用户

发布于 2013-06-19 16:21:08

使用Jean V.Adams提供的内容,您可以使用以下内容从该数据帧创建数据帧。

代码语言:javascript
复制
 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)))})
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17177661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档