首页 > 解决方案 > R-比较组中跨多列的行

问题描述

我有一个数据框,其中包含样本(按行)及其在多列中的值。在某些情况下,样本已重复。我想要做的是比较这些重复列中的值并将输出放入新的df中。如果值匹配,我想用 1 表示这一点,如果它们不匹配 0。NA 应该导致 NA。

我尝试做的类似于这里。但是,我只想比较重复的样本,而不是像链接中的示例那样比较所有行的所有组合。但是我找不到将那里给出的解决方案转换为我的问题的方法。

示例数据:

Sample  x.1  x.2  y.1  y.2  z.1  z.2
------------------------------------
ID1     66   66   102  104  33   37
ID2     66   72   100  104  31   35
ID2     66   72   100  104  NA   NA
ID3     64   66   104  104  35   37
ID4     72   72   100  102  31   37
ID4     72   72   NA   NA   31   37
ID4     72   72   100  102  31   31
ID5     66   66   102  102  35   35
ID5     66   72   100  100  31   37

结果我在一个新的df中寻找:

Sample  x.1  x.2  y.1  y.2  z.1  z.2
------------------------------------
ID2     1    1    1    1    NA   NA
ID4     1    1    NA   NA   1    0
ID5     1    0    0    0    0    0

我按照这些思路尝试了一些方法,但它不起作用,因为它只给我 1 作为输出,所以这绝对是不正确的。

test <- df %>% 
  group_by(Sample) %>%
  mutate(across(1:6, funs(ifelse(.[1,]==.[2,], 1, 0))))

标签: rdplyrtidyverse

解决方案


您可以先删除每个组中只有 1 行的组,然后summarise按组删除其余列。

library(dplyr)

df %>%
  group_by(Sample) %>%
  filter(n() > 1) %>%
  summarise(across(x.1:z.2, 
            ~if(any(is.na(.))) NA else as.integer(n_distinct(.) == 1)))

#  Sample   x.1   x.2   y.1   y.2   z.1   z.2
#  <chr>  <int> <int> <int> <int> <int> <int>
#1 ID2        1     1     1     1    NA    NA
#2 ID4        1     1    NA    NA     1     0
#3 ID5        1     0     0     0     0     0

推荐阅读