我目前使用Hmisc包手动创建大型data.frame的相关矩阵,如下所示:
mydatacorrelation001 <- rcorr(as.matrix(mydata, use = "pairwise.complete.obs"))
我现在需要根据日历月周期计算每个变量与子集之间的相关性(例如,2015-05&#39;或者#5; 15&#39;)。
这些日期目前每天都是&#39; (例如2015-05-29)所以我考虑了一个新专栏“月份”#39;如下:
mydata$Month <- factor(format(mydata$Date, "%B"),levels = month.name)
- @Andy Clifton在另一个答案中提出的建议
(虽然我需要将其格式化为&#39; Mar-15&#39;而不是&#39; March&#39;)
是否有下一种方法可以为每个月子集自动创建每个新的rcorr矩阵变量(Eg.mydatacorrelation002,mydatacorrelation003等)?
非常感谢
答案 0 :(得分: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)
})