重塑多重id重复变量读数从长到宽

时间:2017-09-08 18:32:39

标签: r reshape data-science reshape2

这就是我所拥有的:

id<-c(1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2)
measure<-c("speed","weight","time","speed","weight","time","speed","weight","time",
           "speed","weight","time","speed","weight","time","speed","weight","time")
value<-c(1.23,10.3,33,1.44,10.4,31,1.21,10.1,33,4.25,12.5,38,1.74,10.8,31,3.21,10.3,33)
testdf<-data.frame(id,measure,value) 

这就是我想要的:

id<-c(1,1,1,2,2,2)  
speed<-c(1.23,1.44,1.21,4.25,1.74,3.21)
weight<-c(10.3,10.4,10.1,12.5,10.8,10.3)
time<-c(33,31,33,37,31,33)
res<-data.frame(id,speed,weight,time) 

问题在于我的变量加快了体重和时间的重复。我可以使用带有if语句的for循环完成它,但它是一个主要的头痛并且效率不高。这是我在stackoverflow上的第一篇文章...长时间用户第一次提问...谢谢你!

4 个答案:

答案 0 :(得分:4)

使用data.table中的rowid(非常类似于@Kelli-Jean的答案):

library(reshape2)

testdf$r <- data.table::rowid(testdf$measure); 
dcast(testdf, id + r ~ measure)

  id r speed time weight
1  1 1  1.23   33   10.3
2  1 2  1.44   31   10.4
3  1 3  1.21   33   10.1
4  2 4  4.25   38   12.5
5  2 5  1.74   31   10.8
6  2 6  3.21   33   10.3

或在一行dcast(testdf, id + data.table::rowid(measure) ~ measure)

或者没有data.table,请添加testdf$r <- ave(testdf$id, testdf$meas, FUN = seq_along)

或者,如果您正在学习data.table包:

library(data.table)
setDT(testdf)
testdf[, r := rowid(measure)]
dcast(testdf, id + r ~ measure)

答案 1 :(得分:2)

如果你想去整齐的路线:

library(tidyr)
library(dplyr)
testdf %>% 
  # add unique id for rows to be able to use spread
  group_by(measure) %>% mutate(unique_id = row_number()) %>% 
  spread(measure, value) %>% select(-unique_id )

R Cookbook是这类问题的绝佳资源:http://www.cookbook-r.com/Manipulating_data/Converting_data_between_wide_and_long_format/

答案 2 :(得分:1)

这是我的解决方案

library(plyr)

a=daply(testdf, .(id, measure), function(x) x$value)
listdf=apply(a, c(3), function(x) rbind(data.frame(x,id=row.names(x))))
df <- ldply(listdf, data.frame)
df$.id=NULL
df <- df[order(df$id),] 
df

  speed time weight id
1  1.23   33   10.3  1
3  1.44   31   10.4  1
5  1.21   33   10.1  1
2  4.25   38   12.5  2
4  1.74   31   10.8  2
6  3.21   33   10.3  2

答案 3 :(得分:0)

安装reshape2以帮助重新格式化数据

然后创建另一个标识符,以帮助按所需数据集中的三个连续行组织数据。

x<-rbind(A,B,C,D,E,F)

将单独的数据集划分为行

testdf <- cbind(testdf, x)

将此新标识符绑定到testdf列

x2<-dcast(testdf, id + id2 ~ measure, value.var="value")

将数据从长格式转换为宽格式

  id id2 speed time weight
1  1   A  1.23   33   10.3
2  1   B  1.44   31   10.4
3  1   C  1.21   33   10.1
4  2   D  4.25   38   12.5
5  2   E  1.74   31   10.8
6  2   F  3.21   33   10.3

这是结果数据集:

 testdf$id2 <- NULL

如果需要,可以使用

删除id2变量
compile