2015-02-06 3 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

+1

Каковы другие условия? Это не было задано в вопросе;) –

+0

Да, я не просил их. Тем не менее, я просто хочу узнать, как я могу это сделать в будущем. Любая рекомендация, как я мог бы это реализовать? – mrquad

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 
Смежные вопросы