创建函数来计算数据帧

时间:2015-05-29 18:00:50

标签: r hmisc

我目前使用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等)?

非常感谢

1 个答案:

答案 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)
})