[英]Create new column in R dataframe based on results from 3 other columns
我有一个包含ID和扫描结果的数据框。 如果未在扫描中看到结果,则表示1。 如果看到结果,则为2;如果扫描未完成,则没有向量。
我希望在数据框的末尾创建一列,以检查所有3列,如果在3次扫描中的任何一次都没有看到结果,则返回“ 2”。 如果在扫描中看不到结果,则为“ 1”;如果患者从未以任何三种方式完成扫描,则为“无”。
我已经尝试在Excel和R中执行此操作。我现在更喜欢使用R,因为我目前正在学习此功能,并希望继续学习新的用法。
我尝试使用
library(tidyverse)
USS_reports %>%
mutate((filter(USSfluid=2 | CTfluid=2 | MRIfluid=2))
id USSFluid CTfluid MRIfluid
1 1 1 1
2 1 1
3 1 1 1
4 1 1
5 1 1
6 1 1
7 1
8 1
9 1
10 1 2
11 1 2
乍一看,这是一个不那么简单的解决方案,但是可以扩展到超过您要检查的这三列。 我将数据帧gather
为长格式,为所有结果的每个ID制作一个字符串,然后使用case_when
检查每种可能性:结果为2,结果为1,或者没有结果。 我喜欢case_when
以避免彼此之间嵌套很多ifelse
。
我还添加了一个测试案例,以解决没有结果的情况,只是为了确保一切都可以。
library(tidyverse)
df %>%
# test case with no results
bind_rows(tibble(id = 12)) %>%
gather(key = scan, value = result, -id) %>%
group_by(id) %>%
summarise(all_str = paste(result, collapse = ",")) %>%
mutate(overall = case_when(
str_detect(all_str, "2") ~ "2",
str_detect(all_str, "1") ~ "1",
T ~ "no result"
))
#> # A tibble: 12 x 3
#> id all_str overall
#> <dbl> <chr> <chr>
#> 1 1. 1,1,1 1
#> 2 2. 1,1,NA 1
#> 3 3. 1,1,1 1
#> 4 4. 1,1,NA 1
#> 5 5. 1,1,NA 1
#> 6 6. 1,1,NA 1
#> 7 7. 1,NA,NA 1
#> 8 8. 1,NA,NA 1
#> 9 9. 1,NA,NA 1
#> 10 10. 1,2,NA 2
#> 11 11. 1,2,NA 2
#> 12 12. NA,NA,NA no result
由reprex软件包 (v0.2.0)于2018-04-27创建。
因为要赋予最高优先级,您可以使用apply
来获取数据帧的每行max
( MARGIN = 1
),但不包括第一个id列( [,-1]
):
USS_reports %>% mutate(summary = apply(USS_reports[,-1], MARGIN = 1,
FUN = function(row)max(row, na.rm = TRUE))) %>%
mutate(summary = ifelse(summary == -Inf, NA, summary))
请注意,当所有cols为NA时,需要使用第二个mutate替换由max返回的-Inf值。 为此,您的df需要为数字。 如果没有,您首先必须做
USS_reports[] <- lapply(USS_reports, as.numeric)
(顺便说一句,如果您想在上面的代码中测试是否相等,则必须使用==而不是=)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.