首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中创建所有可能的变量组合

在R中创建所有可能的变量组合
EN

Stack Overflow用户
提问于 2020-07-02 15:46:51
回答 1查看 68关注 0票数 0

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

代码语言:javascript
复制
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)

在那之后,我使用以下代码重塑了它,将每个列表示为月份

代码语言:javascript
复制
#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到上面的结果。对于上述所有其他组合也是如此。我如何才能做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-02 17:04:22

您可以使用这种基于R的方法,并使用combn,假设所有参数的所有years都有数据,其中df1是来自上面以arrange(name)结尾的输出的数据帧。

代码语言:javascript
复制
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为原始数据。

代码语言:javascript
复制
new_data <- rbind(df1, do.call(rbind, data))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62691463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档