繁体   English   中英

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

[英]Create new column in R dataframe based on results from 3 other columns

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

我希望在数据框的末尾创建一列,以检查所有3列,如果在3次扫描中的任何一次都没有看到结果,则返回“ 2”。 如果在扫描中看不到结果,则为“ 1”;如果患者从未以任何三种方式完成扫描,则为“无”。

  • 基本上结果“ 2”是主要矢量-如果它出现在数据帧行中,我希望它显示在新列中
  • 如果“ 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 

乍一看,这是一个不那么简单的解决方案,但是可以扩展到超过您要检查的这三列。 我将数据帧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来获取数据帧的每行maxMARGIN = 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM