如何首先使用 case_when over unique value 创建一个新变量
how to use case_when over unique value first to create a new variable
我有一个数据框(x)
。如您所见,我对同一个 ID 有不同的值(bp:yes/no 和 N),但有时,我有一个唯一的 ID,始终为 bp ==no.
x
ID bp N
8012199 no 75
8012199 yes 2
8012211 no 118
8012211 yes 2
8012321 no 37
8012341 no 146
8012342 no 84
我想创建一个新变量(frequency: low and high
)
x
ID bp N frequency
8012199 no 75
8012199 yes 2 low
8012211 no 118
8012211 yes 4 high
8012321 no 37 low
8012341 no 146 low
8012342 no 84 low
根据不同的条件:
- 如果 bp == 是 | n < 2:低
- 如果 bp == 是 | n > 2 :高
- 如果 ID 是唯一的(总是 = 否):低
到目前为止我试过的是
r <- x %>%
mutate(bp= case_when(
duplicated(ID)==FALSE ~ "low",
bp %in% "yes" & n <=2 ~ "low",
bp %in% "yes" & n > 2 ~ "high" ))
duplicated(x$ID)
FALSE TRUE FALSE TRUE FALSE FALSE FALSE
它对“是”条件有效,但对重复无效。任何建议都会很棒!
您的两个示例略有不同 - 第 4 行中的 N 已更改。
我使用了第二个示例数据:
x <- tibble::tribble(
~ID, ~bp, ~N,
"8012199", "no", 75,
"8012199", "yes", 2,
"8012211", "no", 118,
"8012211", "yes", 4,
"8012321", "no", 37,
"8012341", "no", 146,
"8012342", "no", 84
)
这是一个使用 tidyverse 的解决方案:
library(tidyverse)
x %>%
group_by(ID) %>%
mutate(
id_count = n(),
frequency = case_when(
bp == "yes" & N <=2 ~ "low",
bp == "yes" & N > 2 ~ "high",
bp == "no" & id_count == 1 ~ "low",
TRUE ~ "")
) %>%
ungroup() %>%
select(-id_count)
基本上,id_count
变量计算每个 ID 号的行数。然后用于生成 low
频率结果。
另外,请注意我使用 N <= 2 来表示“低”频率。我是根据您提供的示例得出的。
我有一个数据框(x)
。如您所见,我对同一个 ID 有不同的值(bp:yes/no 和 N),但有时,我有一个唯一的 ID,始终为 bp ==no.
x
ID bp N
8012199 no 75
8012199 yes 2
8012211 no 118
8012211 yes 2
8012321 no 37
8012341 no 146
8012342 no 84
我想创建一个新变量(frequency: low and high
)
x
ID bp N frequency
8012199 no 75
8012199 yes 2 low
8012211 no 118
8012211 yes 4 high
8012321 no 37 low
8012341 no 146 low
8012342 no 84 low
根据不同的条件:
- 如果 bp == 是 | n < 2:低
- 如果 bp == 是 | n > 2 :高
- 如果 ID 是唯一的(总是 = 否):低
到目前为止我试过的是
r <- x %>%
mutate(bp= case_when(
duplicated(ID)==FALSE ~ "low",
bp %in% "yes" & n <=2 ~ "low",
bp %in% "yes" & n > 2 ~ "high" ))
duplicated(x$ID)
FALSE TRUE FALSE TRUE FALSE FALSE FALSE
它对“是”条件有效,但对重复无效。任何建议都会很棒!
您的两个示例略有不同 - 第 4 行中的 N 已更改。
我使用了第二个示例数据:
x <- tibble::tribble(
~ID, ~bp, ~N,
"8012199", "no", 75,
"8012199", "yes", 2,
"8012211", "no", 118,
"8012211", "yes", 4,
"8012321", "no", 37,
"8012341", "no", 146,
"8012342", "no", 84
)
这是一个使用 tidyverse 的解决方案:
library(tidyverse)
x %>%
group_by(ID) %>%
mutate(
id_count = n(),
frequency = case_when(
bp == "yes" & N <=2 ~ "low",
bp == "yes" & N > 2 ~ "high",
bp == "no" & id_count == 1 ~ "low",
TRUE ~ "")
) %>%
ungroup() %>%
select(-id_count)
基本上,id_count
变量计算每个 ID 号的行数。然后用于生成 low
频率结果。
另外,请注意我使用 N <= 2 来表示“低”频率。我是根据您提供的示例得出的。