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

时间:2012-10-25 13:51:38

标签: r loops dataframe anonymous-function

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

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

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

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

2 个答案:

答案 0 :(得分: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

我认为更简单的方法是

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

答案 1 :(得分:7)

看看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

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

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