如何将两个不同的ID协调为一个,然后应用于具有两个ID的df,但在R中仅对主题计数一次?

如何将两个不同的ID协调为一个,然后应用于具有两个ID的df,但在R中仅对主题计数一次?,r,join,data-wrangling,R,Join,Data Wrangling,我对同一个受试者患者有两个不同的ID。 在另一个ID向量中,两个ID都在其中,表示同一个患者。如何只计算一个ID1患者,而不是两个ID不同的患者 ID1 ID2 11 12 13 14 15 16 载体 11,12,13,13,14,16 我只想按ID1计算唯一的患者,这样我就可以 x=11,13,15 谢谢大家! 为每个患者创建一个唯一的ID号,以长格式获取数据,使两个ID位于同一列中,将其与向量连接,选择向量值以获得不同的ID值 资料 我想你可能需要这个 df %>% f

我对同一个受试者患者有两个不同的ID。 在另一个ID向量中,两个ID都在其中,表示同一个患者。如何只计算一个ID1患者,而不是两个ID不同的患者

ID1 ID2 
 11 12
 13 14
 15 16
载体

11,12,13,13,14,16
我只想按ID1计算唯一的患者,这样我就可以

x=11,13,15
谢谢大家!

为每个患者创建一个唯一的ID号,以长格式获取数据,使两个ID位于同一列中,将其与向量连接,选择向量值以获得不同的ID值

资料


我想你可能需要这个

df %>% filter((ID1 %in% vector) | (ID2 %in% vector)) %>%
   select(ID1)

  ID1
1  11
2  13
3  15
用更好的样品检查一下

df <- structure(list(ID1 = c(11L, 13L, 15L, 17L, 19L, 21L), ID2 = c(12L, 
14L, 16L, 18L, 20L, 22L)), class = "data.frame", row.names = c(NA, 
-6L)

> df
  ID1 ID2
1  11  12
2  13  14
3  15  16
4  17  18
5  19  20
6  21  22


vector <- c(11, 12, 13, 13, 14, 16, 18, 18)

> df %>% filter((ID1 %in% vector) | (ID2 %in% vector)) %>% select(ID1)
  
   ID1
1  11
2  13
3  15
4  17
通过选择带有apply to subset ID1的行,您可以使用带有%in%的任意行

或者使用行和

数据:


输出不是应该是11,13,16吗?不,按ID1计算,那么为什么需要向量呢?那就是df$ID1?如果这不是你想要的,也许可以提供一个更好的例子。我认为OP只需要ID1的结果。请在我的答案末尾看到您的代码中有细微的修改。
df %>% filter((ID1 %in% vector) | (ID2 %in% vector)) %>%
   select(ID1)

  ID1
1  11
2  13
3  15
df <- structure(list(ID1 = c(11L, 13L, 15L, 17L, 19L, 21L), ID2 = c(12L, 
14L, 16L, 18L, 20L, 22L)), class = "data.frame", row.names = c(NA, 
-6L)

> df
  ID1 ID2
1  11  12
2  13  14
3  15  16
4  17  18
5  19  20
6  21  22


vector <- c(11, 12, 13, 13, 14, 16, 18, 18)

> df %>% filter((ID1 %in% vector) | (ID2 %in% vector)) %>% select(ID1)
  
   ID1
1  11
2  13
3  15
4  17
df %>%
  mutate(ID = row_number()) %>%
  tidyr::pivot_longer(cols = c(ID1, ID2)) %>%
  inner_join(tibble::enframe(vector), by = 'value') %>%
  distinct(ID, .keep_all = T) %>%
  select(ID, value) %>%
  inner_join(df %>% mutate(ID = row_number()), by = 'ID') %>%
  select(ID1)
ID$ID1[apply(ID, 1, function(z) any(v %in% z))]
#[1] 11 13 15
ID$ID1[rowSums(sapply(ID, "%in%", v)) > 0]
#[1] 11 13 15
ID <- read.table(header=TRUE, text="ID1 ID2 
 11 12
 13 14
 15 16")
v <- c(11,12,13,13,14,16)