【问题标题】:With vs. lapply - why does with not work here?With vs. lapply - 为什么 with 在这里不起作用?
【发布时间】:2016-07-14 11:39:45
【问题描述】:

我正在尝试学习 R,但无法真正弄清楚何时适当地使用 with。我在想这个例子:

目标是以多种方式将整个数据帧“stroke”(在 ISwR 数据库中)中的“dstr”和“die”转换为日期格式(仅供练习)。我已经设法做到了:

#applying a function to the whole data frame - use the fact that data frames are lists actually
rawstroke=read.csv2(system.file("rawdata","stroke.csv",package="ISwR"),na.strings=".")
names(rawstroke)=tolower(names(rawstroke))
ix=c("dstr","died")
rawstroke[ix]=lapply(rawstroke[ix],as.Date,format="%d.%m.%Y")
head(rawstroke)

但是,当我尝试使用 with 函数时,它不会将数据帧作为输出,而只会写入函数 myfun 的定义。这是我尝试过的代码。

myfun=function(x)
{y=as.Date(x,format="%d.%m.%Y")
 return(y)}
rawstroke=read.csv2(system.file("rawdata","stroke.csv",package="ISwR"),na.strings=".")
names(rawstroke)=tolower(names(rawstroke))
ix=c("dstr","died")
bla=with(rawstroke[ix],myfun)
head(bla)

如果有人能帮我解决这个问题,那就太好了。

【问题讨论】:

  • 您似乎认为with() 以某种方式循环了环境变量,但事实并非如此。它甚至与lapply() 不一样。在控制台中查看源代码with.default。它基本上只是一种访问环境的简单而干净的方式。

标签: r lapply with-statement


【解决方案1】:

是的,这似乎不是 with 的工作。要在此处使用您的函数,您只需将第一个代码中的 as.Date 替换为 myfun 并删除格式参数,例如

rawstroke[ix]=lapply(rawstroke[ix], myfun)

with 用于更干净地访问数据帧和环境中的变量。例如,而不是

t.test(dat$x, dat$y)

你可以的

with(dat, t.test(x, y))

【讨论】:

  • 谢谢。所以基本上我可以在 with 中使用函数,前提是我可以明确地写下来?我的意思是,例如 with(stroke,age*2) 效果很好(在元素上循环)。但是如果想使用我定义的函数,我应该使用 lapply?
  • 听起来像一个新问题,从这里不清楚为什么会循环遍历元素。 with 不做循环,它完全适用于任何表达式,它不仅在全局环境中查找变量,而且在你正在执行该表达式的任何“with”中查找变量。
  • 谢谢。我想我明白了。好吧,在某种程度上,我认为它确实在循环,它明智地应用了操作元素。如果我理解正确,它会以某种方式解释操作是元素方式还是列方式,因此在这个意义上它是灵活的。
  • 不是真的...也许您注意到矢量化操作的影响?无论您是否使用with,都会发生这种情况。
猜你喜欢
  • 2013-06-27
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
  • 2013-05-16
  • 2019-02-10
  • 2017-10-11
  • 1970-01-01
相关资源
最近更新 更多