2015-11-07 1 views
1

У меня есть фрейм данных с факторных переменныхКак создать логическую переменную на основе логического состояния?

> a <- c("a", "b", "c") 
> b <- c("c", "b", "a") 
> df <- as.data.frame(cbind(a,b)) 
> df$a <- as.factor(df$a) 
> df$b <- as.factor(df$b) 
> df 
    a b 
1 a c 
2 b b 
3 c a 

я создаю новую логическую переменную на основе подобия вар а и вар б.

> df$result <- isTRUE(df$a == df$b) 

Но я получаю результат:

> df 
    a b result 
1 a c FALSE 
2 b b FALSE 
3 c a FALSE 

Когда я ожидал

> df 
    a b result 
    1 a c FALSE 
    2 b b TRUE 
    3 c a FALSE 

(я использую факторы, чтобы повторить свои реальные данные)

Что я делаю неправильно? Как я могу достичь своей цели определения аналогичных переменных? Благодаря

ответ

3

Вобще

df$result <- with(df, a==b) 
df 
# a b result 
#1 a c FALSE 
#2 b b TRUE 
#3 c a FALSE 

a==b уже возвращает логический вектор и нам не нужно isTRUE чтобы обернуть его.

Как @Frank, упомянутый в комментариях, лучше оценить между столбцами класса character, поскольку разница в уровнях factor может привести к ошибке. Мы можем либо преобразовать factor в character для оценки

with(df, as.character(a)==as.character(b)) 

или сделать уровни таким же, как и в обеих колонках

Un1 <- union(levels(df$a), levels(df$b)) 
df[] <- lapply(df, factor, levels=Un1) 
with(df, a==b) 
+0

Большое спасибо @akrun, это работает! Является ли() надежным для использования внутри функции? – jpinelo

+0

@jpinelo Я думаю, это должно сработать. Я использовал 'with', чтобы избежать вызова' df $ 'каждый раз. BTW, если вы используете это внутри функции, не используйте usign '$' и вместо этого используйте '[' – akrun

+0

Конечно, большое спасибо @akrun. – jpinelo