Я знаю, что вопрос об отключении столбца списка во фрейме данных поднимался и отвечал несколько раз. Однако здесь потенциально 237. проблема такого рода.
У меня есть следующие данные:
set.seed(666)
dat <- data.frame(sysRespNum = c(1,2,3,4,5,6),
product1 = sqrt(rnorm(6, 20, 5)^2),
product2 = sqrt(rnorm(6, 20, 5)^2),
product3 = sqrt(rnorm(6, 20, 5)^2))
данные:
sysRespNum product1 product2 product3
1 1 23.766555 13.46907 24.32327
2 2 30.071773 15.98740 11.39922
3 3 18.224328 11.03880 20.67063
4 4 30.140839 19.78984 19.62087
5 5 8.915628 30.75021 24.29150
6 6 23.791981 11.14885 21.72450
Теперь я хочу вычислить долю каждого продукта в сумме всех продуктов, поэтому я хочу вычислить product1/sum(my three products)
, затем то же самое для продукта 2 и 3. Итак, я ожидаю трех новых столбцов.
Я пробовал следующее:
library(tidyverse)
dat %>%
mutate(sum_Product = apply(across(-sysRespNum), 1, function(x) list(sum_Product = x/sum(x))))
(побочный вопрос: может быть, есть более простой способ изменить это напрямую без необходимости создавать список. Теперь я могу сначала создать столбец суммы, а затем выполнить простое изменение вместе с поперечным. Но мне интересно, если вычисления может быть достигнуто без предварительного создания столбца временной суммы)
Теперь моя проблема в том, что трудно отключить столбец списка sum_Product
. unnest_wider
не работает, столбец sum_Product
по-прежнему является списком.
Так что единственное, что сработало для меня, это
- следуя этому решению: https://stackoverflow.com/a/60824506/2725773
- изменив мой код выше и заменив часть
list
наdata.frame
:
полный код:
dat %>%
mutate(sum_Product = apply(across(-sysRespNum), 1, function(x) data.frame(sum_Product = x/sum(x)))) %>%
unnest(cols = everything()) %>%
mutate(product = rep(1:3, nrow(.)/3)) %>%
pivot_wider(values_from = sum_Product,
names_from = product,
names_prefix = "share_product")
что дает правильный результат:
# A tibble: 6 x 7
sysRespNum product1 product2 product3 share_product1 share_product2
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 23.8 13.5 24.3 0.386 0.219
2 2 30.1 16.0 11.4 0.523 0.278
3 3 18.2 11.0 20.7 0.365 0.221
4 4 30.1 19.8 19.6 0.433 0.285
5 5 8.92 30.8 24.3 0.139 0.481
6 6 23.8 11.1 21.7 0.420 0.197
# … with 1 more variable: share_product3 <dbl>
Однако кажется излишне сложным разложить все, а затем изменить форму с помощью pivot_wider.
Итак, а) есть ли более элегантный способ вычисления моих общих переменных и б) есть ли более элегантный / короче / менее подробный способ преобразования столбца списка в несколько векторных столбцов?
prop.table
должно это делатьvars <- names(dat)[startsWith(names(dat), "product")]; dat[paste0("share_",vars)] <- prop.table(as.matrix(dat[vars]), 1)
- person thelatemail   schedule 09.12.2020