我有什么应该是一个简单的重塑问题,但我无法弄清楚。部分数据如下所示:
foo <- structure(list(grade = c(3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
3, 3, 4, 4, 5, 5, 6, 6), var.type = structure(c(3L, 2L, 3L, 2L,
3L, 2L, 3L, 2L, 3L, 2L, 3L, 2L, 3L, 2L, 3L, 2L, 3L, 2L, 3L, 2L
), .Label = c("Raw Score", "SE", "SS"), class = "factor"), var.val = c(120L,
47L, 120L, 46L, 120L, 46L, 120L, 47L, 120L, 46L, 120L, 46L, 120L,
12L, 120L, 14L, 120L, 16L, 120L, 20L)), .Names = c("grade", "var.type",
"var.val"), row.names = c(2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L,
11L, 12L, 13L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L), class = "data.frame")
或
grade var.type var.val
2 3 SS 120
3 3 SE 47
4 4 SS 120
5 4 SE 46
6 5 SS 120
7 5 SE 46
我想让它看起来像这样:
grade SS SE
3 120 47
4 120 46
5 120 46
等等。我已经尝试过reshape,cast和dcast,就像在这个帖子中一样:
但似乎没有任何效果。我真的很感激一些帮助。 TIA。
答案 0 :(得分:7)
如果你想重塑并且你有重复项,那么你需要给每一对一个唯一的id:
foorle <- rle(foo$grade)
fooids <- rep(seq_len(length(foorle$values)), times=foorle$lengths)
fooids
[1] 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10
现在你可以正确使用重塑:
idfoo <- cbind(id=fooids, foo)
library(reshape)
dcast(idfoo, id+grade~var.type, value.var="var.val")
id grade SE SS
1 1 3 47 120
2 2 4 46 120
3 3 5 46 120
4 4 6 47 120
5 5 7 46 120
6 6 8 46 120
7 7 3 12 120
8 8 4 14 120
9 9 5 16 120
10 10 6 20 120
编辑:请注意我假设您的数据正常,否则您将无法区分重复数据。如果不是,您可以随时使用order
以便它。
答案 1 :(得分:4)
library(plyr)
library(reshape2)
# First we add a grouping variable to deal with the duplicates
foo <- ddply(foo, .(grade, var.type), function(x) { x$group <- 1:nrow(x); x })
dcast(foo, grade + group ~ var.type, value.var= "var.val")[-2]
grade SE SS
1 3 47 120
2 3 12 120
3 4 46 120
4 4 14 120
5 5 46 120
6 5 16 120
7 6 47 120
8 6 20 120
9 7 46 120
10 8 46 120
答案 2 :(得分:2)
它不像重塑那么漂亮,但是
data.frame(grade = foo[2 * (1:(nrow(foo)/2)),]$grade,
SS = foo[foo$var.type == "SS", ]$var.val,
SE = foo[foo$var.type == "SE", ]$var.val )
产生
grade SS SE
1 3 120 47
2 4 120 46
3 5 120 46
4 6 120 47
5 7 120 46
6 8 120 46
7 3 120 12
8 4 120 14
9 5 120 16
10 6 120 20
您必须假设数据成对出现。
答案 3 :(得分:0)
如果您不有任何重复项,这将很有效:
ss <- subset(foo, var.type=='SS')
se <- subset(foo, var.type=='SE')
ss <- data.frame(grade=ss$grade,SS=ss$var.val)
se <- data.frame(grade=se$grade,SE=se$var.val)
bar <- merge(ss,se,by='grade')