【发布时间】:2018-03-16 20:49:18
【问题描述】:
我正在用 R 编写一个闪亮的应用程序,对于我的部分代码,我需要识别数据帧中超过某个级别的所有元素。诀窍是,每行的阈值都不同。最终目标是有一个列表,其中元素 [[1]] 是一个两列数据框,第一列是名称(取自原始列名),第二列是执行(或未执行)的值,无论哪种方式)通过布尔测试。
这是一个可重现的起点:
set.seed(20)
rows = 400
cols = 300
df <- data.frame(matrix(runif(rows*cols), nrow = rows), row.names = NULL)
colnames(df) <- paste0('col', 1:cols)
compare <- runif(rows)
df 是原始数据, compare 是每行应与之比较的值的向量。 我已经编写了一个可以执行我想要的工作的代码块,但是它运行得相当慢,这对我的 Shiny 应用程序来说是一个麻烦。我花了比我预期的更长的时间来获得这个解决方案,但我知道我并不总是最高效的程序员,尤其是在 R 中应用循环时,所以我想知道是否有更快/更有效的方法这样做。
我目前的解决方案:
res <- lapply(1:nrow(df), function(x){
currRow <- df[x,]
tf <- currRow >= compare[x]
ret2 <- data.frame(names(currRow)[tf], currRow[tf], row.names = NULL)
colnames(ret2) <- c('Name', 'Value')
ret2 <- ret2[complete.cases(ret2),]
ret2 <- ret2[order(-ret2$Value),]
return(ret2)
})
提前谢谢你。
【问题讨论】:
标签: r dataframe shiny apply lapply