小编A. *_*tam的帖子

deparse(substitute())正常返回函数名,但是在for循环中调用函数代码

在一个非常具体的案例中,我对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)

任何人都可以向我解释为什么会发生这种情况以及如何防止它发生?

r non-standard-evaluation

10
推荐指数
1
解决办法
1347
查看次数

如何从数据框中删除超出变量特定范围的记录?[R]

我有一个数据帧和一个预测模型,我想应用于数据.但是,我想过滤掉模型可能不适用的记录.为此,我有另一个数据帧,其中包含每个变量在训练数据中观察到的最小值和最大值.我想从我的新数据中删除那些一个或多个值超出指定范围的记录.

为了使我的问题清楚,这就是我的数据可能是这样的:

  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 outliers

5
推荐指数
1
解决办法
385
查看次数

POSIXct对象为NA,但is.na()返回FALSE

我在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)

r date posixct lubridate dplyr

5
推荐指数
1
解决办法
759
查看次数

标签 统计

r ×3

date ×1

dplyr ×1

lubridate ×1

non-standard-evaluation ×1

outliers ×1

posixct ×1