有人能帮我创建一个基于一些严格标准的新专栏吗?
数据如下所示
screening consistancyAPP consistancyVAF consistancyCRF
XXX/01 Missing 50-100% target 50-100% target
XXX/03 0-49% target 0-49% target 0-49% target
XXX/08 Missing Missing 50-100% target
XXX/13 Missing Missing Missing
XXX/09 Missing 0-49% target 50-100% target
XXX/04 0-49% target 0-49% target 50-100% target
df <- data.frame (screening = c("XXX/01", "XXX/03", "XXX/08","XXX/13","XXX/09","XXX/04"),
consistancyAPP = c("Missing", "0-49% target", "Missing","Missing","Missing","0-49% target"),
consistancyVAF = c("50-100% target", "0-49% target", "Missing","Missing","0-49% target","0-49% target"),
consistancyCRF = c("50-100% target", "0-49% target", "50-100% target","Missing","50-100% target","50-100% target")
)
新列的条件
f 211
。
我希望输出结果像这样
screening consistancyAPP consistancyVAF consistancyCRF consistancyOverall
XXX/01 Missing 50-100% target 50-100% target 50-100% target
XXX/04 0-49% target 0-49% target 0-49% target 0-49% target
XXX/08 Missing Missing 50-100% target 50-100% target
XXX/13 Missing Missing Missing Missing
XXX/09 Missing 0-49% target 50-100% target 0-49% target
XXX/04 0-49% target 0-49% target 50-100% target 0-49% target
发布于 2021-03-27 06:44:32
您可以编写一个函数,该函数根据条件返回输出并应用于每一行。
library(dplyr)
calculateOverall <- function(x) {
tmp <- sort(table(x), decreasing = TRUE)
#If all three are same
case_when(n_distinct(x) == 1 ~ first(x),
#If two missing take other
sum(x == 'Missing') >= 2 ~ x[x!= 'Missing'][1],
#If two in agreement take that value
tmp[1] >= 2 ~ names(tmp)[1],
#If all three different
n_distinct(tmp) == 1 ~ '0-49% target')
}
df %>%
rowwise() %>%
mutate(consistancyOverall = calculateOverall(c_across(starts_with('consistancy'))))
# screening consistancyAPP consistancyVAF consistancyCRF consistancyOverall
# <chr> <chr> <chr> <chr> <chr>
#1 XXX/01 Missing 50-100% target 50-100% target 50-100% target
#2 XXX/03 0-49% target 0-49% target 0-49% target 0-49% target
#3 XXX/08 Missing Missing 50-100% target 50-100% target
#4 XXX/13 Missing Missing Missing Missing
#5 XXX/09 Missing 0-49% target 50-100% target 0-49% target
#6 XXX/04 0-49% target 0-49% target 50-100% target 0-49% target
或者使用purrr::pmap_chr
:
df %>%
mutate(consistancyOverall = purrr::pmap_chr(select(., starts_with('consistancy')),
~calculateOverall(c(...))))
https://stackoverflow.com/questions/66818393
复制