首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用purrr的map函数执行逐行prop.tests并将结果添加到dataframe中?

如何使用purrr的map函数执行逐行prop.tests并将结果添加到dataframe中?
EN

Stack Overflow用户
提问于 2018-03-11 16:36:11
回答 2查看 4.5K关注 0票数 5

我试图在R中解决以下问题:我有一个包含两个变量的数据(成功的数量和总试验的数量)。

代码语言:javascript
复制
# A tibble: 4 x 2
 Success     N
    <dbl> <dbl>
1     28.   40.
2     12.   40.
3     22.   40.
4      8.   40.

我希望对每一行执行一个prop.test或binom.test,并将结果列表添加到dataframe (或其中的某些元素,如p值和CIs)。

理想情况下,我想添加第三列与p-值和CI-范围。到目前为止,我的尝试都失败了。下面是一个最小的编码示例:

代码语言:javascript
复制
Success <- c( 38, 12, 27, 9)
N <- c( 50, 50, 50, 50)
df <- as.tibble( cbind(Success, N))


df %>%
  map( ~ prop.test, x = .$Success, n = .$N)

并没有达到预期的结果。任何帮助都将不胜感激。

干杯,

露易丝

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-11 16:58:36

如果您想要一个新的列,您可以使用@akrun的方法,但是在dplyrbroom中添加一个小的purrr

代码语言:javascript
复制
library(tidyverse) # for dplyr, purrr, tidyr & co.
library(broom)
    
analysis <- df %>%
  set_names(c("x","n")) %>% 
  mutate(result = pmap(., prop.test)) %>% 
  mutate(result = map(result, tidy)) 

这样你就可以在一个整齐的嵌套的tibble中得到结果。如果您只想将其限制在某些变量上,那么只需遵循mutate/map将函数应用到嵌套框架,然后取消嵌套()。

代码语言:javascript
复制
analysis %>% 
  mutate(result = map(result, ~select(.x, p.value, conf.low, conf.high))) %>% 
  unnest(cols = c(result))

# A tibble: 4 x 5
      x     n   p.value conf.low conf.high
  <dbl> <dbl>     <dbl>    <dbl>     <dbl>
1 38.0   50.0 0.000407    0.615      0.865
2 12.0   50.0 0.000407    0.135      0.385
3 27.0   50.0 0.671       0.395      0.679
4  9.00  50.0 0.0000116   0.0905     0.319
票数 6
EN

Stack Overflow用户

发布于 2018-03-11 16:38:59

我们可以在用‘pmap’的参数更改列名之后使用prop.test

代码语言:javascript
复制
pmap(setNames(df, c("x", "n")), prop.test)

或者使用map2

代码语言:javascript
复制
map2(df$Success, df$N, prop.test)

map的问题是它正在遍历数据集的每个列,并且它是vector的一个list of vector

代码语言:javascript
复制
df %>%
   map(~ .x)
#$Success
#[1] 38 12 27  9

#$N
#[1] 50 50 50 50

所以,我们不能做.x$Success.x$N

更新

正如@Steven Beaupre所提到的,如果我们需要创建具有p值和置信区间的新列。

代码语言:javascript
复制
res <- df %>%
        mutate(newcol = map2(Success, N, prop.test), 
            pval = map_dbl(newcol, ~ .x[["p.value"]]), 
            CI = map(newcol, ~ as.numeric(.x[["conf.int"]]))) %>% 
            select(-newcol) 
# A tibble: 4 x 4
#   Success     N      pval CI       
#    <dbl> <dbl>     <dbl> <list>   
#1   38.0   50.0 0.000407  <dbl [2]>  
#2   12.0   50.0 0.000407  <dbl [2]>
#3   27.0   50.0 0.671     <dbl [2]>
#4    9.00  50.0 0.0000116 <dbl [2]>

“CI”列是由两个元素组成的list,可以通过unnest编辑使其成为“长”格式的数据。

代码语言:javascript
复制
res %>%
   unnest

或创建3列

代码语言:javascript
复制
df %>% 
  mutate(newcol = map2(Success, N,  ~ prop.test(.x, n = .y) %>% 
                  {tibble(pvalue = .[["p.value"]],
                         CI_lower = .[["conf.int"]][[1]], 
                         CI_upper = .[["conf.int"]][[2]])})) %>%
  unnest
# A tibble: 4 x 5
#  Success     N    pvalue CI_lower CI_upper
#    <dbl> <dbl>     <dbl>    <dbl>    <dbl>
#1   38.0   50.0 0.000407    0.615     0.865
#2   12.0   50.0 0.000407    0.135     0.385
#3   27.0   50.0 0.671       0.395     0.679
#4    9.00  50.0 0.0000116   0.0905    0.319
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49222353

复制
相关文章

相似问题

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