我想分析R中的默认数据集(mtcars数据集)。我有兴趣根据以下规则创建相关系数列。仅在“mpg”和“wt”之间的前三个观测值((即,行1,2,3))的相关系数,然后离开第一行,再次计算下三个观测值之间的相关系数(即,第2,3行, 4)在mpg和wt之间然后离开前两行,再次计算mpg和wt之间的下三个观察值(即,行3,4,5)之间的相关系数,依此类推直到结束。例如
cor(mtcars$mpg[c(1,2,3)],mtcars$wt[c(1,2,3)])
cor(mtcars$mpg[c(2,3,4)],mtcars$wt[c(2,3,4)])
cor(mtcars$mpg[c(3,4,5)],mtcars$wt[c(3,4,5)]);
等等。 任何人都可以帮助如何使用循环等自动化这个R代码。
Example,看看我是如何需要输出的,我已经在excel中完成了但我需要在R中完成。
答案 0 :(得分:1)
cor(mtcars$mpg[c(1,2,3)],mtcars$wt[c(1,2,3)])
的值是-0.8884586;但是,问题中输出图像的“关联”列中的第一个值不是这样,因此相对于所需内容的描述,所显示的图像中存在一些错误。我们假设描述是正确的,样本输出不是。
尝试滚动申请rollapply
。它将函数cor2
应用于宽度为3的滚动窗口。align = "left"
表示它使用当前行和接下来的2行,以便NA值出现在问题中的图像中。 fill = NA
使它为最后2个元素生成NA值,因为这些元素不再有3个元素。
library(zoo)
mtcars2 <- mtcars[c("mpg", "wt")]
cor2 <- function(x) cor(x[, 1], x[, 2])
transform(mtcars2, cor = rollapply(mtcars2, 3, cor2, by.column = FALSE,
align = "left", fill = NA))
,并提供:
mpg wt cor
Mazda RX4 21.0 2.620 -0.88845855
Mazda RX4 Wag 21.0 2.875 -0.82589964
Datsun 710 22.8 2.320 -0.87097656
Hornet 4 Drive 21.4 3.215 -0.99520846
Hornet Sportabout 18.7 3.440 -0.99985063
Valiant 18.1 3.460 -0.99534538
Duster 360 14.3 3.570 -0.97267882
Merc 240D 24.4 3.190 -0.90784130
Merc 230 22.8 3.150 -0.96247218
Merc 280 19.2 3.440 -0.86602540
Merc 280C 17.8 3.440 -0.99308187
Merc 450SE 16.4 4.070 -0.05428913
Merc 450SL 17.3 3.730 -0.96311366
Merc 450SLC 15.2 3.780 -0.99534934
Cadillac Fleetwood 10.4 5.250 0.05301502
Lincoln Continental 10.4 5.424 -0.98658763
Chrysler Imperial 14.7 5.345 -0.96899291
Fiat 128 32.4 2.200 0.44730718
Honda Civic 30.4 1.615 -0.86317499
Toyota Corolla 33.9 1.835 -0.94182141
Toyota Corona 21.5 2.465 -0.99341821
Dodge Challenger 15.5 3.520 -0.94720046
AMC Javelin 15.2 3.435 0.21168794
Camaro Z28 13.3 3.840 -0.90670560
Pontiac Firebird 19.2 3.845 -0.99864434
Fiat X1-9 27.3 1.935 -0.99939736
Porsche 914-2 26.0 2.140 -0.99630829
Lotus Europa 30.4 1.513 -0.99962223
Ford Pantera L 15.8 3.170 -0.93453339
Ferrari Dino 19.7 2.770 -0.96372018
Maserati Bora 15.0 3.570 NA
Volvo 142E 21.4 2.780 NA
另请参阅此SO帖子,除了data.table上下文之外,它是相似的:Rolling correlation with data.table
答案 1 :(得分:0)
我不清楚为什么你想要在3
行/观察窗口内计算看起来像滚动相关的内容,但你可以在基数R中做这样的事情:
x <- lapply(seq(1, nrow(mtcars) - 2), function(x) seq(x, x + 2))
此处x
是一个list
,其中包含行/观察的条目,我们根据这些行/观察计算相关性。
df <- do.call(rbind, lapply(x, function(x) cor(mtcars$mpg[x], mtcars$wt[x])))
df;
# [,1]
#[1,] -0.88845855
#[2,] -0.82589964
#[3,] -0.87097656
#[4,] -0.99520846
#[5,] -0.99985063
#[6,] -0.99534538
#[7,] -0.97267882
#[8,] -0.90784130
#[9,] -0.96247218
#[10,] -0.86602540
#[11,] -0.99308187
#[12,] -0.05428913
#[13,] -0.96311366
#[14,] -0.99534934
#[15,] 0.05301502
#[16,] -0.98658763
#[17,] -0.96899291
#[18,] 0.44730718
#[19,] -0.86317499
#[20,] -0.94182141
#[21,] -0.99341821
#[22,] -0.94720046
#[23,] 0.21168794
#[24,] -0.90670560
#[25,] -0.99864434
#[26,] -0.99939736
#[27,] -0.99630829
#[28,] -0.99962223
#[29,] -0.93453339
#[30,] -0.96372018