У меня есть фрейм данных, в котором каждая строка содержит значения для определенного возраста (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))
Хотите ли вы получить результат в широком или длинном формате?
@BenBolker широкий
если CC
— это результат вашего вызова group_map()
, то
bind_cols(care_dist, do.call(rbind, CC))
предоставит вам широкоформатный тиббл, включающий все приблизительные значения (с именами ...6
, ...7
, ... может быть, вы хотите написать функцию-оболочку, которая дает эти лучшие имена?)
(Я не уверен, зачем мне понадобился do.call(rbind, ...)
вместо bind_rows()
.)
1) Предполагая, что желаемый результат представляет собой фрейм данных размером 6 x 37 с исходными именами строк и именами столбцов M*.
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
2) Базовое решение R:
care_dist |>
apply(1, \(y) approx(x = c(0,6,15,24,36), y = y, xout = 0:36)$y) |>
t() |>
as.data.frame() |>
setNames(paste0("M", 0:36))
care_dist |> rowwise() |> reframe(approx = approx(x = c(0,6,15,24,36), y = c(M0,M6,M15,M24,M36), xout = 0:36)$y)
получает нужный столбец, но не включает исходные значения...