【问题标题】:Separating vector into two columns with dplyr mutate使用 dplyr mutate 将向量分成两列
【发布时间】:2020-12-06 17:56:03
【问题描述】:

假设我有以下功能

get_answer <- function(condition, dp, rp){
  if(condition == "DD"){
    result <- rbinom(n = 2, size = 1, prob = dp)
  }
  
  if(condition %in% c("DR", "RD")){
    result <- c(rbinom(n = 1, size = 1, prob = dp), 
                rbinom(n = 1, size = 1, prob = rp))
  }
  
  if(condition == "RR"){
    result <- rbinom(n = 2, size = 1, prob = rp)
  }
  
  return(result)
}

我像这样创建一个data.frame:

results_df <- data.frame(condition = c(rep("DD", 10000), rep("DR", 10000), rep("RR", 10000)))

我希望能够获取从get_answer 返回的向量,用于condition 列中的条件,并将返回值分成两列——第一个值进入列P1,第二个值进入列P2

类似这样的:

results_df %>% mutate(p1 = get_answer(condition, .6, .4)[0], p2 = get_answer(condition, .6, .4)[1])

在 dplyr 中执行此操作的正确方法是什么?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    该函数未矢量化。因此,我们需要使用rowwise 在每一行上应用它。此外,R 中的索引从 1 开始,而不是 0

    library(dplyr)
    results_df %>%
         rowwise %>%
         mutate(p1 = get_answer(condition, .6, .4)[1], 
                 p2 = get_answer(condition, .6, .4)[2])
    

    我们可以有一个list 列,然后使用来自tidyrunnest_wider,而不是调用该函数两次

    library(tidyr)
    library(stringr)
    out <- results_df %>%
        rowwise %>%
        mutate(p1 = list(get_answer(condition, .6, .4) %>%
               as.list)) %>%
        ungroup %>%
        unnest_wider(c(p1)) %>%
        rename_at(-1, ~ str_c('p', seq_along(.)))
        
    

    【讨论】:

    • 啊,有道理。谢谢你。我知道这超出了问题的范围,但是我需要做什么才能使函数“矢量化”?我不确定我是否完全理解了这一点。
    • 这不会导致两次调用get_answer 吗?是否可以只调用一次并将第一个值拆分为p1,将第二个值拆分为p2
    • @Parseltongue if/else 期望输入长度为 1,而矢量化的 iflese 可以具有 > 长度 1
    • 谢谢!它实际上似乎只调用两次函数就运行得更快
    猜你喜欢
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多