#r
#r
Вопрос:
Это исходные данные.фрейм
temp <- structure(list(Initial = c(
32.5, 30.4, 36.5, 4.2, 24.3
), Amount = c(
374.24, 79.05, 1.02, 0.79, 0.71
), Load = c(
11.512, 2.605, 0.027, 0.021, 0.019
), Extra = c(
36.9, 32.5, 12.2, 12.2, 12.2
), Perc = c(
114L, 107L, 33L, 33L, 33L
)), row.names = c(
1L, 2L, 3L, 4L, 5L
), class = "data.frame")
Это то, что я хочу создать. Я бы предпочел аккуратный способ.
data <- structure(list(Rs = c(
"Initial", "Initial", "Initial", "Initial",
"Initial", "Initial", "Initial", "Initial", "Initial", "Initial",
"Initial", "Initial", "Initial", "Initial", "Initial", "Initial",
"Initial", "Initial", "Initial", "Initial", "Amount", "Amount",
"Amount", "Amount", "Amount", "Amount", "Amount", "Amount", "Amount",
"Amount", "Amount", "Amount", "Amount", "Amount", "Amount", "Load",
"Load", "Load", "Load", "Load", "Load", "Load", "Load", "Load",
"Load", "Extra", "Extra", "Extra", "Extra", "Extra"
), Rvalue = c(
32.5,
30.4, 36.5, 4.2, 24.3, 32.5, 30.4, 36.5, 4.2, 24.3, 32.5, 30.4,
36.5, 4.2, 24.3, 32.5, 30.4, 36.5, 4.2, 24.3, 374.24, 79.05,
1.02, 0.79, 0.71, 374.24, 79.05, 1.02, 0.79, 0.71, 374.24, 79.05,
1.02, 0.79, 0.71, 11.512, 2.605, 0.027, 0.021, 0.019, 11.512,
2.605, 0.027, 0.021, 0.019, 36.9, 32.5, 12.2, 12.2, 12.2
), Cs = c(
"Amount",
"Amount", "Amount", "Amount", "Amount", "Load", "Load", "Load",
"Load", "Load", "Extra", "Extra", "Extra", "Extra", "Extra",
"Perc", "Perc", "Perc", "Perc", "Perc", "Load", "Load", "Load",
"Load", "Load", "Extra", "Extra", "Extra", "Extra", "Extra",
"Perc", "Perc", "Perc", "Perc", "Perc", "Extra", "Extra", "Extra",
"Extra", "Extra", "Perc", "Perc", "Perc", "Perc", "Perc", "Perc",
"Perc", "Perc", "Perc", "Perc"
), Cvalue = c(
374.24, 79.05, 1.02,
0.79, 0.71, 11.512, 2.605, 0.027, 0.021, 0.019, 36.9, 32.5, 12.2,
12.2, 12.2, 114, 107, 33, 33, 33, 11.512, 2.605, 0.027, 0.021,
0.019, 36.9, 32.5, 12.2, 12.2, 12.2, 114, 107, 33, 33, 33, 36.9,
32.5, 12.2, 12.2, 12.2, 114, 107, 33, 33, 33, 114, 107, 33, 33,
33
)), class = "data.frame", row.names = c(NA, -50L))
Ответ №1:
Мы можем выполнить цикл, используя names(temp)
, select
требуемые столбцы, затем gather
, наконец, связывает все фреймы данных вместе
library(tidyverse)
#head(names(temp),-1)
map_dfr(names(temp)[-length(temp)], ~select(temp,.x:ncol(temp)) %>%
gather(key = Cs,value = Cvalue,-.x) %>% mutate(Rs=.x) %>%
select(Rs,Rvalue=.x,everything()))
Комментарии:
1. Идеально! Спасибо.
Ответ №2:
Объяснение того, что pmap
делает:
pmap(list(x, y, z), fun)
то же самое, что Map(fun, x, y, z)
. Затем pmap_dfr
делает то же самое, но дополнительно rbind
объединяет все элементы результирующего списка в один фрейм данных.
library(tidyverse)
pairs <- expand.grid(names(temp), names(temp), stringsAsFactors = F) %>%
filter(Var1 > Var2)
pmap_dfr(pairs, ~{
tibble(Rs = .y, Rvalue = temp[[.y]],
Cs = .x, Cvalue = temp[[.x]])
})
редактировать: На самом деле, неясно, как вы решаете, какие Rs
, Cs
пары вы включаете, а какие нет. Какой бы ни была логика, начиная с expand.grid
и фильтрации, вероятно, вам туда.
Комментарии:
1. Я просто хочу, чтобы каждая пара отображалась один раз.
2. Верно, но вопрос в том, в каком порядке (который является Rs, а который Cs)? Если это не имеет значения, то данное решение должно работать.
3. это не имеет значения, и я думаю, что это работает. Спасибо. Не могли бы вы сказать мне, что
pmap_dfr
делает? Я не использовал его раньше.