Подмножество данных, только если наблюдения двух переменных совпадают друг с другом в R - PullRequest
1 голос
/ 02 апреля 2019

У меня есть такие данные:

a <- c("blue", "red", "green", "blue","cyan")
b <- c("red","red","green","blue", "orange")
df <- data.frame(a,b)
df

      a      b
1  blue    red
2   red    red
3 green  green
4  blue   blue
5  cyan orange

Я пытаюсь установить подстановку строк, если синий и красный совпадают друг с другом и смотрят друг с другом.

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

 sub <- df[df$a %in% c("blue", "red" & df$b %in% c("blue","red"), ]
 table(sub$a, sub$b)

Это очень сложно для меня. Как я могу сказать R подмножеству, только если синий и красный совпадают и смотрят друг с другом?

Желаемый вывод:

      a      b
1  blue    red
2   red    red
3  blue   blue

Конечная цель этого состоит в том, чтобы создать таблицу на случай непредвиденных обстоятельств 2 на 2, отделив ее от таблицы на 5 на 5. Если есть другое предложение сделать это, это будет высоко оценено.

Заранее спасибо!

Это то, что я имею в виду, я не хочу. Я просто хочу сохранить наблюдения сине-красных наблюдений. Я не хочу никаких наблюдений за зеленым, оранжевым, голубым.

            Blue        Red            Green        Orange   Cyan
  Blue       28          39              32            3        1  
  Red        47         244             184           56        3
  Green      0           0               0            0         0
  Orange     0           0               0            0         0
  Cyan       0           0               0            0         0

Ответы [ 3 ]

2 голосов
/ 02 апреля 2019

Вы можете добавить функцию droplevels(), например:

# here the markus solution
twobytwo <- df[which(df$a %in% c("blue", "red") & df$b %in% c("blue","red")), ]
#here the droplevels, that removes the unused level
table(droplevels(twobytwo))

         b
a      blue red
  blue    1   1
  red     0   1

Больше информации здесь .

0 голосов
/ 02 апреля 2019

Вы можете попробовать отфильтровать data.frame, используя grepl:

require(tidyverse)

result <- df %>% 
  varhandle::unfactor() %>%
  filter(grepl(pattern = paste(c("red", "blue"), collapse="|"), a) |
         grepl(pattern = paste(c("red", "blue"), collapse="|"), b))

result
     a    b
1 blue  red
2  red  red
3 blue blue

table(result)
      b
a      blue red
  blue    1   1
  red     0   1
0 голосов
/ 02 апреля 2019

Это должно работать!

output <- df[df$a %in% c('red','blue') & df$b %in% c('red','blue'),]
...