как получить различия между несколькими группами столбцов - PullRequest
0 голосов
/ 17 мая 2019

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

df<-structure(list(X1 = c(37L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, NA, 
11L, 12L), X2 = c(40L, NA, 35L, 35L, 35L, 34L, NA, 28L, 28L, 
NA, 25L, 24L), X3 = c(60L, 44L, 49L, 41L, NA, NA, NA, 25L, 26L, 
NA, NA, 22L), T1 = c(19L, 55L, 47L, 46L, 36L, 42L, 25L, NA, 33L, 
42L, 50L, 22L), T2 = c(75L, NA, 32L, 44L, 27L, 31L, 17L, NA, 
18L, 45L, 10L, 11L), T3 = c(5L, 6L, 7L, 8L, 9L, 10L, 11L, NA, 
46L, 36L, 42L, NA), P1 = c(2L, 2L, 3L, 4L, 2L, 6L, 7L, 8L, 9L, 
NA, 1L, 12L), P2 = c(40L, 44L, 4L, 2L, 1L, 1L, NA, 1L, 1L, 1L, 
5L, 55L), P3 = c(1L, 44L, 49L, 3L, NA, NA, NA, 25L, 26L, NA, 
NA, 66L)), class = "data.frame", row.names = c(NA, -12L))

У меня три группы, и у каждой группы есть 3 столбца, они называются X, T и P.

Я пытаюсь выяснитьсколько строк в каждой группе перекрывается другой группой и сколько строк в каждой группе отличается от другой группы.(каждая строка каждой группы должна как минимум иметь 2 значения)

, поэтому я ищу такой вывод

X 10 rows overlapping with T and 2 different 
T has 10 overlapping with X and 2 different 
X has 10 overlapping with P and 1 different 
T has 10 overlapping with P and 3 different 

это означает, что у меня есть 10 рядов X1, X2 и X3, которыеимеют как минимум 2 значения, и они имеют значения в группе T (T1, T2, T3).Есть одна строка, которая полностью пуста или имеет только 1 значение, но у них есть значения в группе T.То же самое для другой комбинации

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Продолжая в соответствии с ответом Джона Колби, вы можете суммировать, сколько строк заполнено 2 или более значениями, отличными от NA, в столбцах каждой буквы:

library(tidyverse)
df_summarized <- df %>%
  rowid_to_column() %>%
  gather(colname, value, -rowid) %>%
  separate(colname, into = c("letter", "number"), sep = 1) %>%
  count(rowid, letter, wt = !is.na(value), name = "num_values") %>%
  mutate(populated = num_values >= 2)

> df_summarized
# A tibble: 36 x 4
   rowid letter num_values populated
   <int> <chr>       <int> <lgl>    
 1     1 P               3 TRUE     
 2     1 T               3 TRUE     
 3     1 X               3 TRUE     
 4     2 P               3 TRUE     
 5     2 T               2 TRUE     
 6     2 X               2 TRUE     
 7     3 P               3 TRUE     
 8     3 T               3 TRUE     
 9     3 X               3 TRUE     
10     4 P               3 TRUE 
# ... with 26 more rows

И затем использовать это для сравнения букв.,Например, здесь я вижу, что 9 строк имеют одинаковое заполненное / не заполненное состояние среди столбцов X и T.Три строки (7, 8 и 10) различаются по их заполненному статусу между этими двумя буквами.

> df_summarized %>%
+   select(-num_values) %>%
+   spread(letter, populated)
# A tibble: 12 x 4
   rowid P     T     X    
   <int> <lgl> <lgl> <lgl>
 1     1 TRUE  TRUE  TRUE 
 2     2 TRUE  TRUE  TRUE 
 3     3 TRUE  TRUE  TRUE 
 4     4 TRUE  TRUE  TRUE 
 5     5 TRUE  TRUE  TRUE 
 6     6 TRUE  TRUE  TRUE 
 7     7 FALSE TRUE  FALSE    # T but no X
 8     8 TRUE  FALSE TRUE     # X but no T
 9     9 TRUE  TRUE  TRUE 
10    10 FALSE TRUE  FALSE    # T but no X
11    11 TRUE  TRUE  TRUE 
12    12 TRUE  TRUE  TRUE 

Мы можем запросить данные, подобные этим, чтобы получить перекрытия и неперекрытия:

df_summarized %>% 
  select(-num_values) %>%
  spread(letter, populated) %>%
  summarize(PT = sum(P==T),
            PT_non = sum(P!=T),
            TX = sum(T==X),
            TX_non = sum(T!=X),
            XP = sum(X==P),
            XP_non = sum(X!=P))

# A tibble: 1 x 6
     PT PT_non    TX TX_non    XP XP_non
  <int>  <int> <int>  <int> <int>  <int>
1     9      3     9      3    12      0
0 голосов
/ 17 мая 2019

Этот вопрос все еще немного двусмыслен и узок, но вот общая идея привести ваши данные в точку, где вы можете легко суммировать данные по различным группам и / или строкам:

library(tidyverse)

df %>%
  as_tibble %>%
  rowid_to_column %>%
  gather(select=-rowid) %>%
  separate(key, into=c('group', 'column'), sep=1) %>%
  group_by(group)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...