我正在寻找一种解决方案,将新列添加到现有数据框/数据表中,这是每个单独行中的第 i 个最高值。例如,如果我想要第 4 个最高值,则新列的第一行将包含 1.9。
data <- data.frame(a = c("a","a","b","b","c","a"),
peak1 = c(1.1,2.5,2.4,2.1,2.5,2.6),
peak2 = c(1.2,2.5,2.4,2.1,2.5,2.6),
peak3 = c(1.3,2.5,2.4,2.1,2.5,2.6),
peak4 = c(1.4,2.5,2.5,2.1,2.5,2.6),
peak5 = c(1.5,2.5,2.46,2.1,2.5,2.6),
peak6 = c(1.6,2.5,2.4,2.1,2.5,2.6),
peak7 = c(1.7,2.5,2.4,2.1,2.5,2.0),
peak8 = c(1.8,2.5,2.4,2.1,2.5,2.1),
peak9 = c(1.9,2.2,2.4,2.1,2.5,2.2),
peak10 = c(2,2.5,2.4,2.1,2.5,2.3),
peak11 = c(2.1,2.5,2.4,2.1,2.5,2.4),
peak12 = c(2.2,2.5,2.4,2.99,3,2.5))
Run Code Online (Sandbox Code Playgroud)
我已经尝试添加一个索引列,然后使用 lapply 函数选择值,但它在每个单元格中返回一个列表,并且在具有 ~3.000.000 条记录的真实数据集上运行速度非常慢。理想情况下,我正在寻找一种可以在几秒钟内解决此问题的解决方案,因为它运行良好。
data$index <- lapply(split(data[,c(-1)],seq(nrow(data))),FUN = order, decreasing = TRUE)
rank <- 4
data$result <- lapply(1:nrow(data), function(row) data[row, data$test[[row]][rank]+1])
Run Code Online (Sandbox Code Playgroud) r ×1