我正在使用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.是否可以这样做?
答案 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