如何将两个不同的 ID 协调为一个,然后应用到具有两个 ID 的 df 但在 R 中仅对主题计数一次?
How to reconcile two different IDs as one, then apply to a df with both IDs but count the subject only once in R?
我对同一个受试者(患者)有两个不同的 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 在同一列中,将其与向量 select 不同 [=12] 的向量值相连接=] 值。
library(dplyr)
df %>%
mutate(ID = row_number()) %>%
tidyr::pivot_longer(cols = c(ID1, ID2)) %>%
inner_join(tibble::enframe(vector), by = 'value') %>%
distinct(ID, .keep_all = TRUE) %>%
select(value)
# value
# <dbl>
#1 11
#2 13
#3 16
数据
df <- structure(list(ID1 = c(11L, 13L, 15L), ID2 = c(12L, 14L, 16L)),
class = "data.frame", row.names = c(NA, -3L))
vector <- c(11, 12, 13, 13, 14, 16)
我想你可能需要这个
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
通过稍微修改Ronak的代码,你可以得到相同的结果
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)
您可以将 any
与 %in%
结合使用,方法是选择带有 apply
的行来子集 ID1
。
ID$ID1[apply(ID, 1, function(z) any(v %in% z))]
#[1] 11 13 15
或使用rowSums
.
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)
我对同一个受试者(患者)有两个不同的 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 在同一列中,将其与向量 select 不同 [=12] 的向量值相连接=] 值。
library(dplyr)
df %>%
mutate(ID = row_number()) %>%
tidyr::pivot_longer(cols = c(ID1, ID2)) %>%
inner_join(tibble::enframe(vector), by = 'value') %>%
distinct(ID, .keep_all = TRUE) %>%
select(value)
# value
# <dbl>
#1 11
#2 13
#3 16
数据
df <- structure(list(ID1 = c(11L, 13L, 15L), ID2 = c(12L, 14L, 16L)),
class = "data.frame", row.names = c(NA, -3L))
vector <- c(11, 12, 13, 13, 14, 16)
我想你可能需要这个
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
通过稍微修改Ronak的代码,你可以得到相同的结果
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)
您可以将 any
与 %in%
结合使用,方法是选择带有 apply
的行来子集 ID1
。
ID$ID1[apply(ID, 1, function(z) any(v %in% z))]
#[1] 11 13 15
或使用rowSums
.
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)