2016-01-26 4 views
0

Вот некоторый фиктивный код и его довольно очевидно, выход:Как соответствовать два столбца логических векторов в пределах кадра данных

xdupe <- as.logical(c("T", "F", "F", "F", "T", "T", "F")) 
ydupe <- as.logical(c("T", "F", "F", "F", "F", "T", "T")) 
cities <- c("Knox", "Whiteville", "Madison", "York", "Paris", "Corona", "Bakersfield") 
df <- data.frame(cities, xdupe, ydupe) 
df$cities <- as.character(df$cities) 

> df 
     cities xdupe ydupe 
1  Knox TRUE TRUE 
2 Whiteville FALSE FALSE 
3  Madison FALSE FALSE 
4  York FALSE FALSE 
5  Paris TRUE FALSE 
6  Corona TRUE TRUE 
7 Bakersfield FALSE TRUE 

Для некоторого контекста, какие xdupe и ydupe представляет собой логические значения для дублированных координат х и у (долгота и широта, соответственно).

Так что мне нужно, чтобы иметь возможность видеть, какие атрибуты в кадре данных имеют ИСТИННЫЕ значения для xdupe и ydupe. В этом конкретном случае это будут города Нокс и Корона. Как я могу сравнить xdupe и y dupe, чтобы я мог вытащить все города, у которых есть ИСТИННЫЕ значения?

+1

Или ' '' Уменьшить ('&', df [-1]) '' 'или' '' do.call ('+', df [-1])> 1''': P Или другие глупые вариации 'do. call' и 'Reduce' –

+0

Другим подходом к игре в гольф будет' pmin (df [2], df [3]) ', предполагая, что есть только TRUE или FALSE записи –

ответ

3

Это можно сделать несколькими способами. Один из вариантов - &. Он станет TRUE только тогда, когда все элементы: TRUE. Итак, если мы используем xdupe & ydupe, он будет сравнивать соответствующие элементы «xdupe» и «ydupe» и получить TRUE только тогда, когда оба элемента имеют значение «TRUE».

i1 <- with(df, xdupe & ydupe) 

Или другой вариант rowSums подмножества набора данных, который включает в себя только логические столбцы. Как бинарное представление для ИСТИНА 1 и FALSE является 0, когда оба истинны для каждого соответствующего элемента, то это приведет к 2.

i1 <- rowSums(df[-1])==2 

, а затем мы подмножество набора данных

Subdf <- df[i1,] 
Subdf 
# cities xdupe ydupe 
#1 Knox TRUE TRUE 
#6 Corona TRUE TRUE