我有一个包含Id和扫描结果的数据框。如果在扫描中未看到结果,则表示1。 2如果看到结果,如果扫描未完成则没有向量。
我希望在数据帧的末尾创建一个列,检查所有3列并返回" 2"如果在3次扫描中的任何一次扫描中看到结果。 " 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
答案 0 :(得分:1)
这是一个解决方案,乍一看不那么简单,但是可以扩展到超过你正在检查的这3列。我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 package(v0.2.0)创建于2018-04-27。
答案 1 :(得分:0)
由于您希望赋予最高值优先权,因此您可以使用apply
获取数据帧的每行max
值(MARGIN = 1
),不包括第一个id列({ {1}}):
[,-1]
请注意,当所有col都是NA NA时,需要第二个mutate来替换max返回的-Inf值。为了实现这一点,你的df需要是数字的。如果没有,你首先必须做
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))
(顺便说一句,如果你想在上面的代码中测试相等性,你必须使用==而不是=)