2015-02-06 45 views
-1

我有一个data.frame,并希望从某个单元中获取某个值(如果另一个值在数据帧中)。在数据帧中获取一定的值

我试过应用函数。

n <- c(2, 3, 0 ,1) 
s <- c(0, 1, 1, 2) 
b <- c("THIS", "FALSE", "NOT", "THIS") 
df <- data.frame(n, s, b) 

df <- sapply(df$Vals, FUN=function(x){ if(b[x]=="THIS") ? n[x] : s[x] }) 

我的逻辑是:

if(b at position x is equal to "This") { 
    add n[x] to the column df$Vals 
} else { 
    add s[x] to the column df$Vals 
} 

x为单行。

任何建议我做错了吗?

我感谢您的回复!

回答

2

像这样:

df$Vals = with(df, ifelse(b=="THIS", n, s)) 

或是给予直接产生的data.frame

transform(df, Vals=with(df, ifelse(b=="THIS", n, s))) 

# n s  b Vals 
#1 2 0 THIS 2 
#2 3 1 FALSE 1 
#3 0 1 NOT 1 
#4 1 2 THIS 1 

有了您的附加条件:

func=Vectorize(function(b, s, n){if(b=='THIS') return(n);if(b==F) return(n+s);s}) 
df$Vals = with(df, func(b,s,n)) 
+0

如果有更多条件,我该怎么办?喜欢'if()elseif()else'? – mrquad 2015-02-06 13:55:06

+1

其他条件是什么?这个问题并没有被问到;) – 2015-02-06 13:59:54

+0

是的,我没有问他们。不过,我只想了解我将来如何做到这一点。任何建议我怎么能实现呢? – mrquad 2015-02-06 14:01:19

1

或者你可以使用row/column索引

df$Vals <- df[1:2][cbind(1:nrow(df),(df$b!='THIS')+1)] 
df 
# n s  b Vals 
#1 2 0 THIS 2 
#2 3 1 FALSE 1 
#3 0 1 NOT 1 
#4 1 2 THIS 1 
相关问题