如何按其中一列中列出的值包含数据框?

时间:2015-09-27 03:52:41

标签: r dataframe lexicographic

我正在使用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按数据框排序,如果是平局,则按列_4的字典升序排序。

以上示例是我使用column_3和column_4对数据框进行排序后数据框的显示方式,如下所示:

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

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

1 个答案:

答案 0 :(得分:2)

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

您的数据(假设没有输入)

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