我正在尝试在数据框中生成新变量,这些变量以数据框中的两个(或更多)其他变量为条件。我相信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)
答案 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拆分为列表,每行都是一个单独的条目。