2

我目前使用 Hmisc 包手动创建大型 data.frame 的相关矩阵,如下所示:

mydatacorrelation001 <- rcorr(as.matrix(mydata, use = "pairwise.complete.obs"))

我现在需要根据日历月期间(例如“2015-05”或“May-15”)计算每个变量在子集上的相关性。

日期目前是“每天”(例如 2015-05-29),所以我考虑包括一个新列“月份”,如下所示:

mydata$Month <- factor(format(mydata$Date, "%B"),levels = month.name)

-@Andy Clifton 在另一个答案中建议

(尽管我需要将其格式化为“Mar-15”而不是“March”)

接下来有没有一种方法可以为每个月的子集自动创建每个新的 rcorr 矩阵变量(例如,mydatacorrelation002、mydatacorrelation003 等)?

非常感谢

4

1 回答 1

2

这是一个带有假数据的示例,希望能向您展示如何处理您的数据:

library(lubridate)
library(Hmisc)

## Create fake data
dates = seq(1.3e9, 1.3e9 + 100e6, length.out=1000)
class(dates) = "POSIXct"
set.seed(20)
dat = data.frame(dates, x=rnorm(1000), y=rnorm(1000))

# Add month-year column
dat$my = paste(month(dat$dates, label=TRUE), year(dat$dates), sep="-")

## Calculate correlations by month
corr.list = list()
corr.list = sapply(unique(dat$my), function(i) {
  corr.list[i] = rcorr(dat$x[dat$my==i], dat$y[dat$my==i])
}, simplify=FALSE)

输出是一个列表,其中每个月-年的相关性是一个单独的列表元素。以下是输出的第一个和最后一个元素:

$`Mar-2011`
      x     y
x  1.00 -0.07
y -0.07  1.00

n= 17 


P
       x      y     
x        0.7831
y 0.7831       

...

$`May-2014`
      x     y
x  1.00 -0.64
y -0.64  1.00

n= 11 


P
       x      y     
x        0.0327
y 0.0327 

更新:根据您的评论,您可以只提供rcorr数据框的整个子集,减去两个日期列,如下所示:

corr.list = list()
corr.list = sapply(unique(dat$my), function(i) {
  dat1 = dat[dat$my==i,]
  corr.list[i] = rcorr(as.matrix(dat1[, -grep("dates|my", names(dat1))]))
}, simplify=FALSE)

更新 2:回答有关输出到 csv 文件的后续问题。这是一种方法:

# Write correlation matrices to a csv file
lapply(names(corr.list), function(my) {
  cat(my, file="corr.csv", append=TRUE)
  cat("\n", file="corr.csv", append=TRUE)
  write.table(corr.list[[my]][1], "corr.csv", sep=",", row.names=FALSE, append=TRUE)
  cat("\n", file="corr.csv", append=TRUE)
})
于 2015-05-29T21:52:10.423 回答