2011-04-19 42 views
11

假设我们有一个数据帧如何根据条件在data.frame中创建新变量?

x y 
1 1 
2 4 
4 5 

你怎么能一个新的变量添加到数据帧,例如,如果x小于或等于1则返回“良好”,x是3-5返回“坏“否则返回”公平“

x y w 
1 1 "good" 
2 2 "fair" 
5 5 "bad" 

应用ocram。所示的方法,但是这里这个不起作用。

d1 <- c("e", "c", "a") 
d2 <- c("e", "a", "b") 

w <- ifelse(d1 == "e" & (d2=="e"), 1, ifelse((d1 == "a") & (d2 =="b"), 2, ifelse(d1 == "e"),3,99)) 

任何想法? 谢谢

+1

看看'cut'函数 – hadley

+0

由于你弄乱了括号,你的上一个代码不工作;它应该总是'ifelse(cond,ifTrue,ifFalse)',从不'ifelse(cond)ifTrue,ifFalse'。 – mbq

+0

谢谢!注意到如此.. :) – eastafri

回答

17

一个明显和直接的可能性是使用“if-else条件”。在这个例子

x <- c(1, 2, 4) 
y <- c(1, 4, 5) 
w <- ifelse(x <= 1, "good", ifelse((x >= 3) & (x <= 5), "bad", "fair")) 
data.frame(x, y, w) 

**在编辑的附加问题** 是你期待什么?

> d1 <- c("e", "c", "a") 
> d2 <- c("e", "a", "b") 
> 
> w <- ifelse((d1 == "e") & (d2 == "e"), 1, 
+ ifelse((d1=="a") & (d2 == "b"), 2, 
+ ifelse((d1 == "e"), 3, 99))) 
>  
> data.frame(d1, d2, w) 
    d1 d2 w 
1 e e 1 
2 c a 99 
3 a b 2 

如果你觉得不舒服与ifelse功能,还可以与ifelse报表等应用程序。

+0

谢谢吨,但方法只限于2个条件?请参阅上面编辑的问题 – eastafri

+1

我编辑了我的答案 – Marco

3

如果您的关卡数量非常有限,则可以尝试将y转换为因子并更改其级别。

> xy <- data.frame(x = c(1, 2, 4), y = c(1, 4, 5)) 
> xy$w <- as.factor(xy$y) 
> levels(xy$w) <- c("good", "fair", "bad") 
> xy 
    x y w 
1 1 1 good 
2 2 4 fair 
3 4 5 bad 
相关问题