2016-03-12 3 views

ответ

3
(df <- data.frame(a = c(T, F, T, T), b = c(T, T, F, T), c = c(F, F, T, T))) 
#  a  b  c 
# 1 TRUE TRUE FALSE 
# 2 FALSE TRUE FALSE 
# 3 TRUE FALSE TRUE 
# 4 TRUE TRUE TRUE 
Reduce(`|`, df) 
# [1] TRUE TRUE TRUE TRUE 
Reduce(`&`, df) 
# [1] FALSE FALSE FALSE TRUE 
+2

А на части ДФ: 'Уменьшить (" | ", df [, c ('a', 'b')])' – Heroka

+1

Домашние животные с м ine: используйте обратные ссылки, а не кавычки, вокруг оператора (\ '| \' и т. д.). R принимает кавычки, но это идиот: мы хотим здесь функцию * name *, а не строку символов, и это разные вещи. –

1

Как я понимаю, вы хотите взять | построчно.

d = data.frame(a = c(TRUE, FALSE), b = c(FALSE, FALSE)) 
#  a  b 
# 1 TRUE FALSE 
# 2 FALSE FALSE 

Таким образом, ожидаемый результат здесь c(TRUE, FALSE).

Вы можете использовать any по всем столбцам в d:

apply(d, 1, any) 
# [1] TRUE FALSE 

именованные столбцы в d:

apply(d[c("a", "b")], 1, any) 
# [1] TRUE FALSE 

соображения эффективности:

library(microbenchmark) 
df <- data.frame(a = c(T, F, T, T), b = c(T, T, F, T), c = c(F, F, T, T)) 
microbenchmark(
    Reduce = Reduce(`|`, df), 
    apply = apply(df, 1, any)) 
# Unit: microseconds 
# expr min  lq  mean median  uq  max neval cld 
# Reduce 6.597 8.2275 11.83880 10.0730 13.4080 36.246 100 a 
# apply 56.423 59.9425 79.86748 66.8265 105.7645 178.409 100 b 
+0

Да, я бы предпочел «Уменьшить» здесь. – effel

+0

Почему? 'any' * is * a' Reduce' над оператором '' \ \ '(возможно, более эффективно реализовано). Хотя, правда, 'any' нужно применять, в то время как \' \ \ "может естественным образом векторизовать. –

+1

Да, в концепции. «Уменьшить» на самом деле быстрее. С другой стороны, 'apply' with' any', вероятно, более читабельна и идиоматична. – effel

Смежные вопросы