我有以下形式的数据:
Id1 Id21 c1 Id22 c2 Id23 c3 Id24 c4
1 20 5 11 9 9 20 32 10
1 40 4 14 9 13 5 36 9
1 43 3 15 3 23 1 39 8
2 47 5 17 8 11 9 10 5
2 5 4 12 8 14 8 28 4
2 6 0 10 2 24 4 23 2
3 . . . . . . . .
3 . . . . . . . .
3
4
.
.
100
100
100
Id1,每个 Id 有三个条目,有对应的 Id2i 和 ci,i -> [1,4] 这样对于每个 id1,id2i 始终处于递增顺序,而 ci 始终处于递减顺序。 我需要的输出是:
Id1 Id2 c
1 9 20
1 32 10
1 11 9
1 14 9
1 36 9
2 11 9
2 17 8
2 12 8
2 14 8
2 47 5
.
.
.
100
100
100
100
100 . .
因此对于 id1 中每个 id 的五个条目,从所有 ci 中选择前 5 个 c,这样 c(输出)是所有 ci 的最大组。 如何在 R 中实现这一点?
最佳答案
使用 dev version of data.table
:
# using first six rows from your post
require(data.table) # v1.9.5+
ans <- melt(setDT(df), measure = patterns(c("^Id2", "^c[0-9]$"))
value.name = c("Id2", "c"))
ans[order(-c), head(.SD, 5L), by=Id1, .SDcols = -(variable)]
# Id1 Id2 c
# 1: 1 9 20
# 2: 1 32 10
# 3: 1 11 9
# 4: 1 14 9
# 5: 1 36 9
# 6: 2 11 9
# 7: 2 17 8
# 8: 2 12 8
# 9: 2 14 8
# 10: 2 47 5
基本上,melt
可以接受列名列表,以将列表中每个元素的列分组到单独的列中。查看 lapply(...)
的结果,了解哪些列组合在一起。
然后我们在按 c
列降序排序后按 Id1
分组,并从属于每个组的数据子集中选取前 5 行。
关于r - 将多个列合并为一个具有 R 中特定条件的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30376926/