根据其他3列的结果在R数据框中创建新列

时间:2018-04-27 14:20:40

标签: r tidyverse

我有一个包含Id和扫描结果的数据框。如果在扫描中未看到结果,则表示1。 2如果看到结果,如果扫描未完成则没有向量。

我希望在数据帧的末尾创建一个列,检查所有3列并返回" 2"如果在3次扫描中的任何一次扫描中看到结果。 " 1"如果在扫描中没有看到结果,并且如果患者从未在任何三种方式上完成扫描,则没有矢量。

  • 基本上结果" 2"是主导向量 - 如果它出现在数据帧行中,我希望它显示在新列
  • if" 2"如果" 1"目前需要出现在新专栏
  • 如果没有任何结果,那么没有结果或NA出现

我试过在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 

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))

(顺便说一句,如果你想在上面的代码中测试相等性,你必须使用==而不是=)