как сравнить два столбца во многих строках - PullRequest
0 голосов
/ 17 января 2019

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

df<- structure(list(X1 = c(37L, 36L, 35L, 35L, 35L, 34L, 29L, 28L, 
28L, 26L, 25L, 24L), X2 = c(40L, 44L, 49L, 41L, 0L, 0L, 0L, 25L, 
26L, 37L, 0L, 22L), M1 = c(60L, 55L, 47L, 46L, 36L, 42L, 25L, 
0L, 33L, 42L, 50L, 22L), M2 = c(19L, 0L, 32L, 44L, 27L, 31L, 
17L, 0L, 18L, 45L, 10L, 11L)), class = "data.frame", row.names = c(NA, 
-12L))

Я хочу сравнить каждую пару столбцов

1 with 2
1 with 3
1 with 4
2 with 3
2 with 4

Я хочу знать, какие строки и сколько строк в столбце 1 имеют значения(кроме 0) по сравнению с другими столбцами То же самое для остальных тоже

например

X1 имеет 12 значений, строка 5,6,7, 11 имеет значения, а X2 не строка 8, имеетзначение, в то время как M1 не имеет строки 2, а 8 имеет значения, в то время как M2 не имеет значения

Таким образом, вывод будет таким:

   Total X1+  X1-  X2+  X2-  M1+  M1-  M2+  M2-
X1   12   0    0   4    0     2    0    1    0 
X2   8    0    4   0    0     1    4    2    4
M1   11   0    1   4    1     0    0    1    0  
M2   10   0    2   4    2     0    1    0    0

Чтобы вычислить сумму для каждого столбца, я могу сделать следующее

colSums(df != 0) 

Я пытался работать с df$X1[df$X1 %in% df$X2] для остальных, но я не мог понять, как сделать такой вывод

1 Ответ

0 голосов
/ 17 января 2019

В моем коде я использую %>% в library(dplyr) только для аккуратности. Я не использую другие функции в нем.

df2 <- data.frame(df != 0)
pair <- expand.grid(1:4, 1:4)
name <- names(df)

mapply(function(x, y){
  a <- sum(df2[[x]] - df2[[y]] == 1)   # TRUE - FALSE = 1
  b <- sum(df2[[x]] - df2[[y]] == -1)  # FALSE - TRUE = -1
  return(c(a, b))
}, pair[[1]], pair[[2]]) %>% t %>%
   matrix(4, 8, dimnames = list(name, c(paste0(name, "+"), c(paste0(name, "-"))))) %>%
   as.data.frame

Вывод: (я отмечаю два значения X1-M1+ и X1-M2+ с *, что означает различные результаты с твоим.)

#    X1+ X2+  M1+  M2+ X1- X2- M1- M2-
# X1   0   4   1*   2*   0   0   0   0
# X2   0   0   1    2    4   0   4   4
# M1   0   4   0    1    1   1   0   0
# M2   0   4   0    0    2   2   1   0

Описание

  • df2: Превратить данные в логические значения, которые означают, что значения равны нулю.
  • pair: Создать все возможные пары столбцов.
  • a: Для условия, которое вы ожидаете в X1+ X2+ M1+ M2+
  • b: Для условия, которое вы ожидаете в X1- X2- M1- M2-
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...