代码之家  ›  专栏  ›  技术社区  ›  Mohan

如何使用任意函数转换数据帧中的每一行?

  •  0
  • Mohan  · 技术社区  · 10 月前

    我有一个数据帧,其中每一行都包含特定年龄(0、6、15、24、36个月)的值。我可以使用以下公式将一行的值插值到其他年龄段 approx 。我如何将此应用于所有行?我尝试过各种各样的东西 rowwise() ,但它们不起作用。

    library(tidyverse)
    library(stats)
    
    care_distribution_table = "Age,M0,M6,M15,M24,M36
    Mother,100.00%,36.89%,29.58%,29.61%,26.64%
    Father,0.00%,11.74%,14.70%,12.23%,11.40%
    Other relative,0.00%,15.80%,14.00%,11.55%,10.20%
    In-home nonrelative,0.00%,7.94%,8.89%,7.33%,6.48%
    Home-based childcare,0.00%,18.62%,20.69%,21.82%,17.38%
    Center childcare,0.00%,9.00%,12.15%,17.46%,27.90%"
    
    care_dist = read.csv(text = care_distribution_table, row.names = 1) |>
      # Convert from % to float
      mutate(across(everything(), ~as.numeric(trimws(.x, whitespace = '%'))) / 100) |>
      # Make sure columns add to 1 (i.e. handle rounding error)
      mutate(across(everything(), ~.x/sum(.x))) 
    
    # This interpolates one row
    approx(x = c(0,6,15,24,36), y = care_dist['Mother',], xout = 0:36)
    
    
    # This gets me most of the way
    care_dist |> rowwise() |> group_map(~approx(x = c(0,6,15,24,36), y = .x, xout = 0:36)$y) 
    
    # This fails
    care_dist |> rowwise() |> group_modify(~df(z = approx(x = c(0,6,15,24,36), y = .x, xout = 0:36)$y)) 
    
    2 回复  |  直到 10 月前
        1
  •  2
  •   Ben Bolker    10 月前

    如果 CC 是您的输出 group_map() 呼叫,然后

    bind_cols(care_dist, do.call(rbind, CC))
    

    将为您提供一个包含所有近似值(带名称)的宽格式tibble ...6 , ...7 , ... 也许你想写一个包装器函数来给这些更好的名字?)

    (我不知道为什么我需要 do.call(rbind, ...) 而不是 bind_rows() .)

        2
  •  2
  •   G. Grothendieck    10 月前

    假设所需的输出是一个具有原始行名和M*列名的6 x 37数据帧

    library(dplyr)
    library(tibble)
    
    care_dist %>%
      rownames_to_column %>%
      reframe(
        approx(x = c(0,6,15,24,36), y = unlist(pick(everything())), xout = 0:36)$y %>%
          as.data.frame.list(col.names = paste0("M", 0:36)), .by = rowname
      ) %>%
      column_to_rownames 
    
    推荐文章