【问题标题】:mapply that outputs a column not a list输出列而不是列表的映射
【发布时间】:2021-12-08 12:39:03
【问题描述】:

是否有一个purrr:: 函数可以像下面的mapply() 调用一样,但输出要添加到我的data 而不是list() 的列?

library(tidyverse)

m=
"
study group outcome
1     1       A
1     1       B
1     2       A
1     2       B
2     1       A
2     1       B
2     2       A
2     2       B
3     1       B
4     1       A
"
data =read.table(text=m,h=T)


set.seed(0)
(mapply(rnorm, n = sapply(group_split(data, study),nrow), mean=1:4*.1))

[[1]]
[1]  1.3629543 -0.2262334  1.4297993  1.3724293

[[2]]
[1]  0.61464143 -1.33995004 -0.72856703 -0.09472045

[[3]]
[1] 0.2942328

[[4]]
[1] 2.804653

【问题讨论】:

    标签: r dataframe tidyverse purrr mapply


    【解决方案1】:

    可以是unlisted。默认情况下mapply 执行SIMPLIFY = TRUE,但这仅适用于输出列表元素具有相同length 的情况。在这里,它不是,这就是它给出输出为 list

    的原因
    unlist((mapply(rnorm, n = sapply(group_split(data, study),nrow), mean=1:4*.1)))
    

    -输出

    [1]  0.3661374 -0.2767027  2.5413646 -0.6953391  0.1451225  0.4501413  0.8182433  0.0273765 -1.9239003 -0.8636144
    

    dplyr,我们可能会这样做

    library(dplyr)
    data %>% 
       group_by(study) %>% 
       mutate(new = rnorm(n(), mean = 1:4 * .1)) %>% 
       ungroup
    # A tibble: 10 × 4
       study group outcome     new
       <int> <int> <chr>     <dbl>
     1     1     1 A        1.36  
     2     1     1 B       -0.126 
     3     1     2 A        1.63  
     4     1     2 B        1.67  
     5     2     1 A        0.515 
     6     2     1 B       -1.34  
     7     2     2 A       -0.629 
     8     2     2 B        0.105 
     9     3     1 B        0.0942
    10     4     1 A        2.50  
    

    【讨论】:

    猜你喜欢
    • 2021-05-18
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    相关资源
    最近更新 更多