我有一个data.table,我正在尝试做类似的事情data[ !is.na(variable) ].但是,对于完全缺失的组,我只想保留该组的第一行.所以,我正在尝试使用by.我在网上做过一些研究并有一个解决方案,但我认为效率低下.
我在下面提供了一个示例,展示了我希望实现的目标,我想知道是否可以在不创建两个额外列的情况下完成此操作.
d_sample = data.table( ID = c(1, 1, 2, 2, 3, 3),
Time = c(10, 15, 100, 110, 200, 220),
Event = c(NA, NA, NA, 1, 1, NA))
d_sample[ !is.na(Event), isValidOutcomeRow := T, by = ID]
d_sample[ , isValidOutcomePatient := any(isValidOutcomeRow), by = ID]
d_sample[ is.na(isValidOutcomePatient), isValidOutcomeRow := c(T, rep(NA, .N - 1)), by = ID]
d_sample[ isValidOutcomeRow == T ]
Run Code Online (Sandbox Code Playgroud)
编辑:这里有一些与thelatemail和Frank的解决方案的速度比较,其中包含一个包含60K行的更大数据集.
d_sample = data.table( ID = sort(rep(seq(1,30000), 2)), …Run Code Online (Sandbox Code Playgroud) 假设我有以下数据:
d = data.table( id = 1, x = c(1, 10, 17, 35, 37, 45) )
Run Code Online (Sandbox Code Playgroud)
我想看看x by group id中的每个第i个元素是否有一个比它大30到40之间的元素.因此,对于x中第一个元素组ID(1),我希望看到1之后x中的任何值是否在值31和41之间.答案是肯定的,所以我想创建一个列valid_gap第一个元素为TRUE.最后,我希望得到:
d_final = data.table( id = 1, x = c(1, 10, 17, 35, 37, 45), valid_gap = c(T, T, F, F, F, F ) )
Run Code Online (Sandbox Code Playgroud)
我和一位同事已经考虑过这个问题了一段时间,我们真的试图避免在这里使用循环,但无法弄明白.这可能没有循环吗?
我最好的尝试是这样的:
d[, valid_gap := any(between( rdist(x[ .N - .I ])[,1], left = 30, right = 40 )), by = id]
Run Code Online (Sandbox Code Playgroud)
但我正在考虑问题,因为试图通过x索引,好像在循环中,我怀疑这是错误的想法.
编辑 - "坏"的解决方案:
x = c(1, 10, 17, 35, 37, 45)
valid_gap = c() …Run Code Online (Sandbox Code Playgroud) 我正在尝试动态创建和循环,htmlwidgets例如DT、plotly、 或rbokeh生成自动针织报告。有没有办法将knitr格式(例如 )添加到此 github 问题https://github.com/ramnathv/htmlwidgets/pull/110tabset中概述的方法中?我也在那里发布了这个问题。tagList
下面是我的想法的一些示例代码,但它不太有效。我想做的是创建 10 个选项卡,每个选项卡都有一个从plot_list. 现在发生的事情是所有绘图都进入最后一个选项卡。在实践中,plot_list会有不同的图/表。
#' ---
#' title: htmltools::tagList test
#' output:
#' html_document
#' ---
#' # {.tabset}
#+ results='asis', echo=FALSE
library(plotly)
library(printr)
plot_list = lapply(1:10,
function(i){
as.widget(plot_ly(iris,
x = iris[["Sepal.Length"]],
y = iris[["Sepal.Width"]],
mode = "markers"))
}
)
htmltools::tagList( lapply(1:10,
function(i) {
pandoc.header(paste0("Tab",i,' {.tabset}'), 2)
plot_list[[i]]
}
)
)
# rmarkdown::render("your_path/htmltoolsTagList_test.r")
Run Code Online (Sandbox Code Playgroud)
之前,我使用嵌套 for 循环成功地完成了类似的操作,但是一旦我尝试使用具有 HTML …