1

我正在使用 R 并且有一个包含四列的数据框。其中一个是数字,另一个在每一行中都有列表:

column_1    column_2    column_3    column_4
a           x           1           c("334", "538", "645", "763")
b           y           2           c("762", "838")
c           z           3           c("78", "85", "529", "797", "859")
d           p           3           c("8", "75", "242", "766")
e           q           4           c("85", "447", "529", "797", "859")

我想按column_3按数据框排序,如果出现平局,按column_4的字典升序排列。

上面的示例是我使用 column_3 和 column_4 对数据框进行排序后的数据框外观,如下所示:

df <- df[order(df$column_3, df$column_4),]

但是,我的预期输出是第 2 行应该出现在第 3 行之后,因为 78 小于 762。可以这样做吗?

4

1 回答 1

2

假设您想在column_4中使用数值而不是字符,您可以执行以下操作:(使用data.table

您的数据(假设没有 dput)

dat <- read.table(header = TRUE, text = "
column_1    column_2    column_3    
a           x           1           
b           y           2           
c           z           3           
d           p           3           
e           q           4")           

column4 <- list(
  c("334", "538", "645", "763"),
  c("762", "838"),
  c("78", "85", "529", "797", "859"),
  c("8", "75", "242", "766"),
  c("85", "447", "529", "797", "859")
)

结合两个数据流

require(data.table)

column4 <- lapply(column4, as.numeric)
dat <- as.data.table(c(dat, column_4 = list(column4)))

给你

   column_1 column_2 column_3            column_4
1:        a        x        1     334,538,645,763
2:        b        y        2             762,838
3:        c        z        3  78, 85,529,797,859
4:        d        p        3       8, 75,242,766
5:        e        q        4  85,447,529,797,859

所以这就是我假设你的数据集。要进行不基于 column_3的排序,然后按字典升序排列column_4的工作方式如下

t.data.table <- function(x) {as.data.table(t(x))}
lex_order <- rbindlist(lapply(dat[,column_4], t.data.table), fill=TRUE)
order_base <- c(dat[,list(column_3)], lex_order)
dat[do.call(order, order_base)]

看看order_base那里发生了什么。

结果如下所示:

   column_1 column_2 column_3            column_4
1:        a        x        1     334,538,645,763
2:        b        y        2             762,838
3:        d        p        3       8, 75,242,766
4:        c        z        3  78, 85,529,797,859
5:        e        q        4  85,447,529,797,859

这与我用于此问题的方法/逻辑相同:How to sort a list by byte-order for AWS-Calls

于 2015-09-27T07:45:32.630 回答