排序两列,有条件地选择值,然后运行cumsum频率

Pro*_*ion 4 sorting r multiple-columns dataframe

我的数据看起来像这样

a   b   c
1   1   0
1   2   8
2   1   0
2   2   2
3   1   3
3   2   3
4   1   7
4   2   4
5   1   3
5   2   5
6   1   1
6   2   8
7   1   1
7   2   2
Run Code Online (Sandbox Code Playgroud)

我想对列进行排序a,c以便列中的每个偶数行c都是列a中每对的最大数字.然后我想获取这些值并将它们存储在一个新对象中.看起来应该是这样的.

a   c   b
1   8   2
2   2   2
3   3   2
4   7   1
5   5   2
6   8   2
7   2   2
Run Code Online (Sandbox Code Playgroud)

Sve*_*ein 5

你可以使用这种方法:

dat[order(dat$a, dat$c), ][c(FALSE, TRUE), ]
#    a b c
# 2  1 2 8
# 4  2 2 2
# 6  3 2 3
# 7  4 1 7
# 10 5 2 5
# 12 6 2 8
# 14 7 2 2
Run Code Online (Sandbox Code Playgroud)

另一种方法dplyr:

library(dplyr)
dat %>%
  arrange(a, c) %>%
  filter(duplicated(a))
Run Code Online (Sandbox Code Playgroud)


Dav*_*urg 5

使用data.table包,您可以使用setorder或通过引用对数据进行排序setkey(无需使用<-函数创建副本)

library(data.table)
setorder(setDT(df), a, c)[]
#     a b c
#  1: 1 1 0
#  2: 1 2 8
#  3: 2 1 0
#  4: 2 2 2
#  5: 3 1 3
#  6: 3 2 3
#  7: 4 1 7
#  8: 4 2 4
#  9: 5 1 3
# 10: 5 2 5
# 11: 6 1 1
# 12: 6 2 8
# 13: 7 1 1
# 14: 7 2 2
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过各种简单的方式实现目标,例如

df[duplicated(a)]
#    a b c
# 1: 1 2 8
# 2: 2 2 2
# 3: 3 2 3
# 4: 4 2 4
# 5: 5 2 5
# 6: 6 2 8
# 7: 7 2 2
Run Code Online (Sandbox Code Playgroud)

或者可能

df[, tail(.SD, 1), a]
#    a b c
# 1: 1 2 8
# 2: 2 2 2
# 3: 3 2 3
# 4: 4 2 4
# 5: 5 2 5
# 6: 6 2 8
# 7: 7 2 2
Run Code Online (Sandbox Code Playgroud)

要么

df[, .SD[2], a]
#    a b c
# 1: 1 2 8
# 2: 2 2 2
# 3: 3 2 3
# 4: 4 2 4
# 5: 5 2 5
# 6: 6 2 8
# 7: 7 2 2
Run Code Online (Sandbox Code Playgroud)

PS如果要更改的顺序,也可以使用setcolorder函数通过引用来执行此操作,例如,

setcolorder(df, c("a", "c", "b"))
Run Code Online (Sandbox Code Playgroud)

  • 最简洁的解决方案! (2认同)