如何在多行中比较两列

时间:2019-01-17 17:42:07

标签: r

我有这样的数据

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 :(得分:0)

在我的代码中,我%>%中使用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+ strong>,这意味着您的结果有所不同。)

#    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::将数据转换为布尔值,这意味着值是否不等于零。
  • 对::创建所有可能的列对。
  • a :对于您在X1+ X2+ M1+ M2+中期望的条件
  • b:对于您在X1- X2- M1- M2-中期望的条件