Как извлечь совпадения в несколько строк? - PullRequest
0 голосов
/ 23 февраля 2019

Я все еще изучаю R, и у меня есть основной вопрос.У меня есть фрейм данных (df), который выглядит следующим образом:

    Factor   P1    P2    P3    P4    P5
 1      A  TRUE FALSE  TRUE FALSE  TRUE
 2      A FALSE  TRUE FALSE FALSE  TRUE
 3      B  TRUE  TRUE  TRUE FALSE FALSE
 4      B  TRUE FALSE FALSE  TRUE FALSE
 5      C FALSE FALSE FALSE  TRUE FALSE
 6      C  TRUE  TRUE FALSE FALSE FALSE

df = data.frame("Factor" = c("A","A","B","B","C","C"),
            "P1" = c("TRUE","FALSE","TRUE","TRUE","FALSE","TRUE"),
            "P2" =c("FALSE","TRUE","TRUE","FALSE","FALSE","TRUE"),
            "P3" = c("TRUE","FALSE","TRUE","FALSE","FALSE","FALSE"), 
            "P4" = c("FALSE","FALSE","FALSE","TRUE","TRUE","FALSE"), 
            "P5" = c("TRUE","TRUE","FALSE","FALSE","FALSE","FALSE"))

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

Factor    P1     P2     P3     P4     P5
  A     TRUE   TRUE   TRUE  FALSE   TRUE
  B     TRUE   TRUE   TRUE   TRUE  FALSE
  C     TRUE   TRUE  FALSE   TRUE  FALSE

Может кто-нибудь помочь?Спасибо!

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Другой вариант tidyverse может быть:

df %>%
 gather(var, val, -Factor) %>%
 group_by(Factor, var) %>%
 mutate(val = ifelse(any(val), TRUE, FALSE)) %>%
 distinct() %>%
 spread(var, val)

  Factor P1    P2    P3    P4    P5   
  <fct>  <lgl> <lgl> <lgl> <lgl> <lgl>
1 A      TRUE  TRUE  TRUE  FALSE TRUE 
2 B      TRUE  TRUE  TRUE  TRUE  FALSE
3 C      TRUE  TRUE  FALSE TRUE  FALSE

Во-первых, он преобразует данные из широких в длинные, исключая переменную «Фактор».Во-вторых, он группируется по «Фактору» и другим переменным.В-третьих, он проверяет состояние.Наконец, он удаляет дублирующиеся строки и возвращает его обратно в широкоформатный формат.

Или на основе идеи @Calum You:

df %>%
 mutate_at(vars(-Factor), as.logical) %>%
 group_by(Factor) %>%
 summarise_all(funs(sum(.) > 0))

Или:

df %>%
 mutate_at(vars(-Factor), as.logical) %>%
 group_by(Factor) %>%
 summarise_all(funs(!all(!.)))

С базой R:

x <- cbind(df[, 1], data.frame(apply(df[, -1], 2, function(x) as.logical(x))))
colnames(x) <- colnames(df)

aggregate(. ~ Factor, x, function(x) any(x))

  Factor   P1   P2    P3    P4    P5
1      A TRUE TRUE  TRUE FALSE  TRUE
2      B TRUE TRUE  TRUE  TRUE FALSE
3      C TRUE TRUE FALSE  TRUE FALSE

Или:

aggregate(. ~ Factor, x, function(x) sum(x) > 0)

Или:

aggregate(. ~ Factor, x, function(x) !all(!x))
0 голосов
/ 23 февраля 2019

Здесь есть два шага:

  1. Преобразовать все столбцы P в логические векторы с as.logical
  2. Группировать на Factor, а затем использовать any дляпосмотрите, являются ли какие-либо из значений для каждого P для каждого Factor TRUE
library(tidyverse)
df <- data.frame("Factor" = c("A", "A", "B", "B", "C", "C"), "P1" = c("TRUE", "FALSE", "TRUE", "TRUE", "FALSE", "TRUE"), "P2" = c("FALSE", "TRUE", "TRUE", "FALSE", "FALSE", "TRUE"), "P3" = c("TRUE", "FALSE", "TRUE", "FALSE", "FALSE", "FALSE"), "P4" = c("FALSE", "FALSE", "FALSE", "TRUE", "TRUE", "FALSE"), "P5" = c("TRUE", "TRUE", "FALSE", "FALSE", "FALSE", "FALSE"))
df %>%
  mutate_at(vars(-Factor), as.logical) %>%
  group_by(Factor) %>%
  summarise_all(any)
#> # A tibble: 3 x 6
#>   Factor P1    P2    P3    P4    P5   
#>   <fct>  <lgl> <lgl> <lgl> <lgl> <lgl>
#> 1 A      TRUE  TRUE  TRUE  FALSE TRUE 
#> 2 B      TRUE  TRUE  TRUE  TRUE  FALSE
#> 3 C      TRUE  TRUE  FALSE TRUE  FALSE

Создано в 2019-02-22 пакетом Представить (v0.2.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...