Удалить строки df, используя информацию о неповторенных уровнях между двумя векторами - PullRequest
0 голосов
/ 04 октября 2019
df <- data.frame(X = c("a", "b", "c", "a", "b", "c", "a", "b", "c", "d" , "a", "b", "c", "d", "e"), 
                  Y = c("w", "w", "w", "K", "K", "K", "L", "L", "L", "L", "Z", "Z", "Z", "Z", "Z"))

Обратите внимание, что первый вектор имеет 5 уровней, а второй - 4 уровня. Моя цель состоит в том, чтобы выбрать линии df, которые имеют все общие уровни вектора 1 как вектор 2. То есть я хочу выбрать линии, которые имеют уровни «a», «b» и «c», поскольку «d» появляется только дважды »и "появляется только в векторе 1.

Я попытался составить список с общими уровнями и оставить только строки с общими уровнями по подмножеству. Однако, это не работает, потому что этот список уровней не генерирует адрес строк, которые я хочу удалить. Пример:

common <- c ("a", "b", "c")
df2 <- df [c(common),]

В моем реальном df есть 64 общих уровня, так что "вручную" не бывает. Кто-нибудь может мне помочь?

Ответы [ 3 ]

2 голосов
/ 04 октября 2019

Я думаю, это то, что вы хотите. По существу split ting X на Y, затем ищем все intersect значения, которые есть в каждом наборе.

df[df$X %in% Reduce(intersect, split(df$X, df$Y)),]

#   X Y
#1  a w
#2  b w
#3  c w
#4  a K
#5  b K
#6  c K
#7  a L
#8  b L
#9  c L
#11 a Z
#12 b Z
#13 c Z
1 голос
/ 04 октября 2019

Другим способом может быть group_by X и выбор групп, которые имеют все различные значения в Y.

library(dplyr)

df %>%
  group_by(X) %>%
  filter(n_distinct(Y) == n_distinct(.$Y))

#   X     Y    
# <fct> <fct>
# 1 a     w    
# 2 b     w    
# 3 c     w    
# 4 a     K    
# 5 b     K    
# 6 c     K    
# 7 a     L    
# 8 b     L    
# 9 c     L    
#10 a     Z    
#11 b     Z    
#12 c     Z    

В базе R это будет использовать ave

subset(df, as.logical(ave(as.character(Y), X, 
          FUN = function(x) length(unique(x)) == length(unique(Y)))))
0 голосов
/ 04 октября 2019

Использование data.table

library(data.table)
setDT(df)[, .SD[uniqueN(Y) == uniqueN(df$Y)], by = X]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...