在一个非常具体的案例中,我对R的行为感到有些惊讶.假设我定义了一个square
返回其参数平方的函数,如下所示:
square <- function(x) { return(x^2) }
Run Code Online (Sandbox Code Playgroud)
我想在另一个函数中调用这个函数,我也想在我这样做时显示它的名字.我可以使用deparse(substitute())
.但是,请考虑以下示例:
ds1 <- function(x) {
print(deparse(substitute(x)))
}
ds1(square)
# [1] "square"
Run Code Online (Sandbox Code Playgroud)
这是预期的输出,所以一切都很好.但是,如果我传递包含在列表中的函数并使用for循环处理它,则会发生以下情况:
ds2 <- function(x) {
for (y in x) {
print(deparse(substitute(y)))
}
}
ds2(c(square))
# [1] "function (x) " "{" " return(x^2)" "}"
Run Code Online (Sandbox Code Playgroud)
任何人都可以向我解释为什么会发生这种情况以及如何防止它发生?
我有一个数据帧和一个预测模型,我想应用于数据.但是,我想过滤掉模型可能不适用的记录.为此,我有另一个数据帧,其中包含每个变量在训练数据中观察到的最小值和最大值.我想从我的新数据中删除那些一个或多个值超出指定范围的记录.
为了使我的问题清楚,这就是我的数据可能是这样的:
id x y
---- ---- ---------
1 2 30521
2 -1 1835
3 5 25939
4 4 1000000
Run Code Online (Sandbox Code Playgroud)
这是我的第二张桌子,包括分钟和最大值,看起来像:
var min max
----- ----- -------
x 1 5
y 0 99999
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我想在我的数据中标记以下记录:2(低于x的最小值)和4(高于y的最大值).
我怎么能在R中轻松做到这一点?我有预感,有一些聪明的dplyr
代码可以完成这项任务,但我不知道它会是什么样子.
我在R中遇到了一些非常特殊的行为。我认为这甚至可能是一个错误,但是我想在这里检查是否有人熟悉它或知道解决方案。
我要尝试的操作如下:我有一个数据框,其中的日期分配给了组。我正在对这些组执行循环,在其中计算该组中日期的最大值。next
如果此最大日期为,我想跳过循环()的其余部分NA
。但是,这不会正确发生。
考虑以下代码:
library(dplyr)
library(lubridate)
a <- data.frame(group = c(1,1,1,1,1, 2,2,2,2, 3),
ds = as_datetime(dmy('01-01-2018', NA, '03-01-2018', NA, '05-01-2018',
'02-01-2018', '04-01-2018', '06-01-2018', '08-01-2018',
NA)))
for (i in 1:3) {
max_ds <- a %>% filter(group == i) %>% .$ds %>% max(na.rm = T)
if (is.na(max_ds)) { next }
print(max_ds)
}
Run Code Online (Sandbox Code Playgroud)
预期的输出是:
# [1] "2018-01-05 UTC"
# [1] "2018-01-08 UTC"
Run Code Online (Sandbox Code Playgroud)
但是,获得的输出是:
# [1] "2018-01-05 UTC"
# [1] "2018-01-08 UTC"
# [1] NA
Run Code Online (Sandbox Code Playgroud)
该谜题的症结似乎在于该na.rm
条款。如果将其删除,则会发生以下情况:
for (i in …
Run Code Online (Sandbox Code Playgroud)