这就是我所拥有的:
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上的第一篇文章...长时间用户第一次提问...谢谢你!
答案 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