簡體   English   中英

使用 dplyr mutate 將向量分成兩列

[英]Separating vector into two columns with dplyr mutate

假設我有以下 function

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 中執行此操作的正確方法是什么?

function 未矢量化。 因此,我們需要使用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列,然后使用unnest_wider中的tidyr ,而不是調用 function 兩次

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM