【问题标题】:Unnesting a dataframe within a dataframe在数据框中取消嵌套数据框
【发布时间】:2019-03-16 19:08:57
【问题描述】:

我一直在尝试通过 Hmisc R 包计算二项分布的置信区间。具体来说,我使用了 binconf 函数,它完美地完成了它的工作。

library(plyr)
library(Hmisc)

Student <- c("A", "B", "C")
TP <- c(13, 36, 43)
obs.pos <- c(16, 37, 48)

df <- data.frame(Student, TP, obs.pos)

df1 <- df %>% 
  plyr::mutate(Sen = binconf(TP, obs.pos, alpha = 0.05, method = "wilson", return.df = TRUE))

df1 %>% View()

#  Student TP obs.pos Sen.PointEst Sen.Lower Sen.Upper
#1       A 13      16    0.8125000 0.5699112 0.9340840
#2       B 36      37    0.9729730 0.8617593 0.9986137
#3       C 43      48    0.8958333 0.7783258 0.9546783

不幸的是,我觉得该函数在我的原始数据框中创建了一个数据框,并且不允许我再对我的输出应用基本函数。例如,我无法选择列(通过使用 dplyr)或舍入数字,因为 R 无法找到创建的列(例如 Sen.PointEst、Sen.Lower、Sen.Upper)。下面是我的输出结构。

df1 %>% str()

#'data.frame':  3 obs. of  4 variables:
# $ Student: Factor w/ 3 levels "A","B","C": 1 2 3
# $ TP     : num  13 36 43
# $ obs.pos: num  16 37 48
# $ Sen    :'data.frame':   3 obs. of  3 variables:
#  ..$ PointEst: num  0.812 0.973 0.896
#  ..$ Lower   : num  0.57 0.862 0.778
#  ..$ Upper   : num  0.934 0.999 0.955

我希望将所有列都放在输出的第一级,以便我可以轻松地将所有常规函数应用于我的输出。

感谢您的帮助!

【问题讨论】:

    标签: r dplyr plyr confidence-interval hmisc


    【解决方案1】:

    我们在data.frame 中有一个data.frame 列。扁平化data.frame 的一种选择是在do.call 内调用data.frame

    dfN <- do.call(data.frame, df1) 
    

    或者另一种选择是在do 中调用binconf

    df %>% 
      do(data.frame(., Sen = binconf(.$TP, .$obs.pos, alpha = 0.05, method = "wilson")))
    

    【讨论】:

    • 我喜欢第二个选项,但如果输出中的一个单元格具有 NA 值,它会返回错误。这是我收到的信息。 Error in if (x &gt; 0) x/(x + qf(1 - alpha/2, nu1, nu2) * (n - x + 1)) else 0 : missing value where TRUE/FALSE needed
    • @MichaelMatta 如果你这样做binconf(df$TP, obs.pos, alpha = 0.05, method = "wilson"),它会返回一个matrix,带有return.df = TRUE。我猜它不适用于NA 值。创建一个索引,然后更新它。即i1 &lt;- !is.na(df$TP); binconf(df$TP[i1], obs.pos, alpha = 0.05, method = "wilson")
    • 我意识到我没有缺失值,而是真正的零。通过在您的代码中将 .$obs.pos 替换为 obs.pos 解决了该问题。你同意吗?
    • @MichaelMatta 是的,我完全忘记了那个变量。你是对的
    【解决方案2】:

    使用tidyverse 包的另一个选项,可以处理缺失值。这目前增加了几个额外的列,这可能是一个错误??

    library(tidyverse)
    
    Student <- c("A", "B", "C", "D", "E")
    TP <- c(13, 36, 43, NA, 0)
    obs.pos <- c(16, 37, 48, NA, 0)
    
    
    
    df <- data.frame(Student, TP, obs.pos)
    
    
    df %>% 
      nest(TP, obs.pos) %>% 
      mutate(out = map_if(
        data, .p = ~ !is.na(.$TP) & !is.na(.$obs.pos),
        .f = ~ Hmisc::binconf(.$TP, .$obs.pos, return.df = TRUE))) %>% 
      unnest(data, out) 
    
    
     Student TP obs.pos  PointEst     Lower     Upper TP1 obs.pos1
    1       A 13      16 0.8125000 0.5699112 0.9340840  NA       NA
    2       B 36      37 0.9729730 0.8617593 0.9986137  NA       NA
    3       C 43      48 0.8958333 0.7783258 0.9546783  NA       NA
    4       D NA      NA        NA        NA        NA  NA       NA
    5       E  0       0       NaN       NaN       NaN  NA       NA
    

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2020-07-30
      • 2021-09-23
      • 2019-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多