【问题标题】:Creating all possible variable combinations in R在 R 中创建所有可能的变量组合
【发布时间】:2020-07-02 07:46:50
【问题描述】:

我有一个包含 4 个参数的每日数据集,我已使用以下代码将其转换为每月数据

library(zoo)
library(hydroTSM)
library(lubridate)
library(tidyverse)

set.seed(123)
df <- data.frame("date"= seq(from = as.Date("1983-1-1"), to = as.Date("2018-12-31"), by = "day"),
                 "Parameter1" = runif(length(seq.Date(as.Date("1983-1-1"), as.Date("2018-12-31"), "days")), 15, 35),
                 "Parameter2" = runif(length(seq.Date(as.Date("1983-1-1"), as.Date("2018-12-31"), "days")), 11, 29),
                 "Parameter3" = runif(length(seq.Date(as.Date("1983-1-1"), as.Date("2018-12-31"), "days")), 50, 90),
                 "Parameter4" = runif(length(seq.Date(as.Date("1983-1-1"), as.Date("2018-12-31"), "days")), 0, 27))

Monthly_data <- daily2monthly(df, FUN=mean, na.rm=TRUE)

之后,我使用以下代码对其进行了重构,以将每一列表示为月份

#Function to convert month abbreviation to a numeric month
mo2Num <- function(x) match(tolower(x), tolower(month.abb))

Monthly_data %>% 
  dplyr::as_tibble(rownames = "date") %>% 
  separate("date", c("Month", "Year"), sep = "-", convert = T) %>% 
  mutate(Month = mo2Num(Month))%>% 
  tidyr::pivot_longer(cols = -c(Month, Year)) %>% 
  pivot_wider(names_from = Month, values_from = value, names_prefix = "Mon",
              names_sep = "_") %>% 
  arrange(name)

现在,我想创建参数组合,例如 Parameter1 * Parameter2, Parameter1 * Parameter3, Parameter1 * Parameter4, Parameter2 * Parameter3, Parameter2 * Parameter4, Parameter3 * Parameter4,它们将作为rbind添加到旋转的月度数据中。新的数据帧 Parameter1 * Parameter2 表示将它们的月值相乘,然后将rbind 与上述结果相乘。对于所有其他上述组合也是如此。我怎样才能做到这一点?

【问题讨论】:

  • 你的意思是把 "Parameter1" , "Parameter2" 数据框乘以它们的月份值,rbind 到上面的结果,第二次取 "Parameter2", "Parameter3" 像这样乘以所有组合取 2时间?
  • 是的,Parameter1 * Parameter2 表示将它们的每月值相乘,然后将rbind 乘以上述结果。

标签: r tidyverse


【解决方案1】:

如果df1 是上述输出中以arrange(name) 结尾的数据帧,则所有参数的所有years 都存在数据,您可以使用combn 使用此基本R 方法。

data <- combn(unique(df1$name), 2, function(x) {
               t1 <- subset(df1, name == x[1])
               t2 <- subset(df1, name == x[2])
               t3 <- t1[-(1:2)] * t2[-(1:2)]
               t3$name <- paste0(x, collapse = "_")
               cbind(t3, t1[1])
               }, simplify = FALSE)

然后您可以rbind 将其转换为原始数据。

new_data <- rbind(df1, do.call(rbind, data))

【讨论】:

  • 重复数据框 4 次是什么意思?我忘记了绑定结果。你可以做rbind(df1, do.call(rbind, data))
  • 抱歉,我应该从t1t2 而不是df1 中获取第一列。更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多