【发布时间】:2016-04-22 20:43:58
【问题描述】:
工作数据集如下所示:
library('data.table')
df <- data.table(Name = c("a","a","b","b","c","c","d","d","e","e","f","f"),
Y = sample(1:30,12),
X = sample(1:30,12))
df
Name Y X
1: a 14 23
2: a 19 18
3: b 10 16
4: b 23 11
5: c 2 12
6: c 12 24
7: d 8 14
8: d 26 2
9: e 16 26
10: e 6 4
11: f 29 28
12: f 28 30
我最终想要的是按组制作图表(基于Name)进行比较:
library(ggplot2)
ggplot(df, aes(X, Y)) + geom_point() + facet_grid(. ~ Name)
由于实际数据集包含更多观察结果和grp。我正在创建的 ggplot 需要花费太多时间来处理,并且最终的图表不可读(grp > 300)。我计划用有限数量的观察对数据重新分组并分别绘制图表(例如,每次绘制 10 个组)。
所以最终的数据集应该是这样的:
Name Y X grp level
1: a 14 23 1 1
2: a 19 18 1 1
3: b 10 16 2 1
4: b 23 11 2 1
5: c 2 12 3 1
6: c 12 24 3 1
7: d 8 14 4 2
8: d 26 2 4 2
9: e 16 26 5 2
10: e 6 4 5 2
11: f 29 28 6 2
12: f 28 30 6 2
然后我可以根据新组level进行绘图:
ggplot(df, aes(X, Y)) + geom_point() + facet_grid(. ~ level)
在上图中,我通过以下方式创建了grp:
df[, grp := .GRP, by = Name]
现在的问题是如何根据grp自动创建level组(我必须创建grp而不是直接使用Name作为基础,因为在原始数据集中,没有模式Name)?
我尝试了类似的方法:
setkey(df, grp)
i <- 1
j <- 1
while(i < 4 ) {
df[levels(factor(grp)) == (i:i+2), level := j]
i <- i + 2
j <- j + 1
}
它不能很好地满足我的需要。谁能给我一些建议如何解决这个问题?我真的被困在这里了。我想可能有一种简单的方法可以做到这一点,也许我什至不需要创建level 组并且可以通过其他方式直接创建单独的图形?
【问题讨论】:
-
level只是grp?cut分成 3 个块,对吧? -
@rawr 是的,我只是举个例子。图中
grp有6个层级,我只是想把它减少到2个层级,每个level在grp中包含1~3个层级。 -
所以
df[, level := as.numeric(cut(grp, breaks = 2))]? -
好吧...它可以按我的意愿工作!想要!我第一次知道
cut命令。如果您想将其作为答案发布,我将为您的答案投票。非常感谢!
标签: r ggplot2 data.table graphing