关于循环:在R中使用带有多个参数的匿名函数

using anonymous functions in R with multiple arguments

我正在尝试在数据框中生成新变量,这些新变量以该数据框中的两个(或多个)其他变量为条件。我相信R中的循环函数(即lapply,sapply等)对于此目的是有用且高效的。但是,对于我的方法来说,有些事情是不正确的,我无法弄清楚是什么。

1
M <- data.frame(x=c("A","A","B","B"), y=c(1,2,1,2))

使用此数据框,我想生成一个新列z,其中包含x =="A"y == 1都为TRUE的逻辑。下面的代码是我在这里可以提出的最好的代码,但是似乎只能评估我的第一个条件。

1
M$z <- sapply(M$x, function(x,y) if((x =="A") && (y == 1)) T else F, M$y)
  • 可以针对我的目的固定此代码吗?
  • 在R中是否有更好的方法,也许可以使用其他循环函数?

这是transform函数

的任务

1
2
3
4
5
6
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

我认为更简单的方法是

1
2
3
4
5
6
7
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


看看mapply:

1
2
3
4
5
6
7
> 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

Apropos,这与匿名函数无关,而与应用多个参数无关。如果您命名该函数,则在任何单参数apply变体中它仍然将不起作用。

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