首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >根据其他三列中的条件创建新列

根据其他三列中的条件创建新列
EN

Stack Overflow用户
提问于 2021-03-26 14:01:06
回答 1查看 106关注 0票数 1

有人能帮我创建一个基于一些严格标准的新专栏吗?

数据如下所示

代码语言:javascript
代码运行次数:0
运行
复制
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
代码语言:javascript
代码运行次数:0
运行
复制
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")
)

新列的条件

  • ,如果所有三个都相同,例如失踪,那么如果两个缺失(例如XXX/08),则取另一个(例如50-100%的目标),
  • ,如果两个一致(例如XXX/01),则该值(例如50-100%的目标)
  • ,如果所有三个不同(XXX/09)都接受较低(0-49%的目标)

f 211

我希望输出结果像这样

代码语言:javascript
代码运行次数:0
运行
复制
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
EN

回答 1

Stack Overflow用户

发布于 2021-03-27 14:44:32

您可以编写一个函数,该函数根据条件返回输出并应用于每一行。

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
df %>%
  mutate(consistancyOverall = purrr::pmap_chr(select(., starts_with('consistancy')),
                              ~calculateOverall(c(...))))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66818393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档