6

我试图在数据框中生成以数据框中两个(或更多)其他变量为条件的新变量。我相信 R 中的循环函数(即 lapply、sapply 等)对于此目的是有用且高效的。但是,我的方法有些不对劲,我不知道是什么。

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

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

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

2 回答 2

9

这是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
于 2012-10-25T13:56:58.007 回答
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

恰当地说,这与匿名函数无关,与应用多个参数有关。如果您命名该函数,它仍然无法在任何单参数应用变体中工作。

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

于 2012-10-25T13:55:04.763 回答