在R中使用带有多个参数的匿名函数

tim*_*kas 6 loops r anonymous-function dataframe

我试图在数据框中生成新变量,这些变量以数据框中的两个(或更多)其他变量为条件.我相信R中的循环函数(即lapply,sapply等)对于此目的是有用且有效的.然而,根据我的方法,有些事情是不对的,我无法弄清楚是什么.

M <- data.frame(x=c("A", "A", "B", "B"), y=c(1,2,1,2))
Run Code Online (Sandbox Code Playgroud)

使用这个数据框,我想生成一个新的列z,包含如果是x == "A"和,则为TRUE的逻辑y == 1.以下代码是我能在这里得到的最好的代码,但似乎只是评估我的第一个条件.

M$z <- sapply(M$x, function(x,y) if((x == "A") && (y == 1)) T else F, M$y)
Run Code Online (Sandbox Code Playgroud)
  • 这个代码可以修复我的目的吗?
  • 有没有更好的方法在R中执行此操作,可能使用其他循环函数?

Ari*_*man 8

看看mapply:

> M$z <- mapply(M$x,M$y, FUN=function(x,y) if((x == "A") && (y == 1)) T else F)
> M
  x y     z
1 A 1  TRUE
2 A 2 FALSE
3 B 1 FALSE
4 B 2 FALSE
Run Code Online (Sandbox Code Playgroud)

Apropos,这与匿名函数无关,也与应用多个参数有关.如果您对该函数进行了命名,则它仍然无法在任何单参数应用变体中使用.

另一种方法是ddply按行,或将data.frame拆分为一个列表,每行都是一个单独的条目.


Jil*_*ina 8

这是一项transform功能任务

transform(M, z=ifelse((x == "A") & (y == 1), T, F))
  x y     z
1 A 1  TRUE
2 A 2 FALSE
3 B 1 FALSE
4 B 2 FALSE
Run Code Online (Sandbox Code Playgroud)

我认为更简单的方法是

M$z <- with(M, (x == "A") & (y == 1))
M
  x y     z
1 A 1  TRUE
2 A 2 FALSE
3 B 1 FALSE
4 B 2 FALSE
Run Code Online (Sandbox Code Playgroud)

  • @AriB.Friedman`ifelse`不是真正的矢量化,不仅仅是`apply()`等.它迭代了向量,但它与使用`==`和`&`的真正向量化操作不同,如本答案的编辑所示. (2认同)