非常相似:How to sort dataframe in R with specified column order preservation?
我的数据示例:
> dat
type attr y1
1 x1 A 0.25
2 x1 B 0.19
3 x1 C 0.06
4 x1 D 0.13
5 x2 A 0.25
6 x2 B 0.00
7 x2 C 0.19
8 x2 D 0.00
我正在创建一些不同的图并希望执行以下操作:
换句话说,对于这个例子,我想要结果:
> datsorted
type attr y1
1 x1 C 0.06
2 x1 D 0.13
3 x1 B 0.19
4 x1 A 0.25
5 x2 C 0.19
6 x2 D 0.00
7 x2 B 0.00
8 x2 A 0.25
我目前知道这样做的唯一方法是疯狂乏味。我根据type
的值创建了两个子集数据帧(一个用于x1,一个用于x2)。然后我创建了一个像这样的新数据框:
> beside
t1 t2 attr x1y1 x2y1
1 x1 x2 A 0.25 0.25
2 x1 x2 B 0.19 0.00
3 x1 x2 C 0.06 0.19
4 x1 x2 D 0.13 0.00
这样我可以按x1y1排序并将所有内容保持在一起......但是我必须以长篇形式将其重新拆分为情节。一定有更好的方法。对不起,如果我错过了另一个答案;我是R的新手,甚至不确定要搜索什么!
根据以下建议,这是原始数据:
> dput(dat)
structure(list(type = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L), .Label = c("x1", "x2"), class = "factor"), attr = structure(c(1L,
2L, 3L, 4L, 1L, 2L, 3L, 4L), .Label = c("A", "B", "C", "D"), class = "factor"),
y1 = c(0.25, 0.19, 0.06, 0.13, 0.25, 0, 0.19, 0)), .Names = c("type",
"attr", "y1"), row.names = c(NA, -8L), class = "data.frame")
答案 0 :(得分:1)
如果我很清楚你想做什么,你可以使用:
ord <- order(dat[dat$type=="x1",]$y1)
dat.sorted <- rbind(dat[ord,], dat[ord + 4,])
基本上这是做什么的:
选择type = x1
的数据 dat[dat$type=="x1",]
获取y1的顺序并将其放入ord
order(dat[dat$type=="x1",]$y1)
订购您的(部分)数据
dat[ord,]
将其余数据排序为第一部分
注意:仅当前4个元素为x1且第2个4为x2
dat[ord+4,]
将其与有序数据合并
dat.sorted <- rbind(dat[ord,], dat[ord+4,])
答案 1 :(得分:1)
以下是三个步骤的解决方案:
xtabs
将您的data.frame转换为2D数组(表格):attr
- by - type
attr
维度as.data.frame.table
a <- xtabs(y1 ~ attr + type, dat)
a
# type
# attr x1 x2
# A 0.25 0.25
# B 0.19 0.00
# C 0.06 0.19
# D 0.13 0.00
b <- a[order(a[, "x1"]), ]
b
# type
# attr x1 x2
# C 0.06 0.19
# D 0.13 0.00
# B 0.19 0.00
# A 0.25 0.25
as.data.frame.table(b, responseName = "y")
# attr type y
# 1 C x1 0.06
# 2 D x1 0.13
# 3 B x1 0.19
# 4 A x1 0.25
# 5 C x2 0.19
# 6 D x2 0.00
# 7 B x2 0.00
# 8 A x2 0.25
答案 2 :(得分:1)
来自type
为x1
的子集:
dat.x1 <- subset(dat, type == "x1")
找到与y1
的增加值相对应的属性:
ord.attr <- dat.x1$attr[order(dat.x1$y1)]
ord.attr
# [1] C D B A
# Levels: A B C D
然后使用ply'r arrange
函数对data.frame进行排序:
require(plyr)
arrange(dat, type, match(attr, ord.attr))
# type attr y1
# 1 x1 C 0.06
# 2 x1 D 0.13
# 3 x1 B 0.19
# 4 x1 A 0.25
# 5 x2 C 0.19
# 6 x2 D 0.00
# 7 x2 B 0.00
# 8 x2 A 0.25