r - 在 R 中将行转换为列以进行统计相关性分析

标签 r rows correlation reshape

我正在尝试将 R 中的列转换为行,而不使用 reshape(无法安装该包)。我收到的数据包括属性及其相应的指标。我想计算所有这些属性之间的统计相关性——总共 16000 个属性与 800 万条记录。并非所有记录都具有相同数量的属性。

为此,我相信我必须将列转换为行,以便我最终可以使用 cor 函数,例如cor(x[,1], x[,2:16000]).如果有某种方法可以按属性使用 cor 函数,即属性 1 和 2、属性 1 和 3、属性 1 ... N 之间的相关性,这可能完全没有必要。任何帮助将不胜感激。

 ID          Attribute  Metric1 
 [1,]  1         1 -1.6363007
 [2,]  2         1  1.1483294
 [3,]  3         1  2.1682566
 [4,]  4         1 -1.1823649
 [5,]  5         1 -1.3631378
 [6,]  1         2 -1.1715544
 [7,]  2         2  1.5164278
 [8,]  3         2 -1.0110274
 [9,]  4         2 -0.9421652
[10,]  5         2 -0.2105443
[11,]  6         2 -0.4143548
[12,]  7         2 -1.6170975
[13,]  8         2  1.2402303
[14,]  9         2  0.4460047
[15,]  7         3  0.1060407
[16,]  8         3  0.9796893
[17,]  9         3  0.9254911
[18,] 10         3 -1.5728600
[19,] 11         3 -0.8082675
[20,] 12         3 -1.8643084

转型:

ID  attribute1  attribute2  attribute3
1   -1.6363007  -1.1715544  na
2   1.1483294   1.5164278   na
3   2.1682566   -1.0110274  na
4   -1.1823649  -0.9421652  na
5   -1.3631378  -0.2105443  na
6   na          -0.4143548  na
7   na          -1.6170975  0.1060407
8   na           1.2402303  0.9796893
9   na           0.4460047  0.9254911
10  na           na         -1.57286
11  na           na         -0.8082675
12  na           na         -1.8643084


test <- cbind(c(rep(1,5),rep(2,9),rep(3,6)), replicate(1,rnorm(20)))
test <- cbind(c(1:5,1:9,7:12),test)

@亚伦

q <- matrix(nrow=20,ncol=3)
colnames(q) <- c("x","y","z")
q[,3] <- replicate(1, rnorm(20))
q[,2] <- c(101,102,103,104,105,106, 107, 108, 101,103,107,109, 104,110,102,103,106,109,108,112)
q[15:20,1] <- 10000003
q[9:14,1] <- 10000002
q[1:8,1] <- 10000001
q <- data.frame(q)
q$x <- factor(q$x)
q$y <- factor(q$y)
q$z <- factor(q$z)

with(q, {
  out <- matrix(nrow=nlevels(x), ncol=nlevels(y),
                dimnames=list(levels(x), levels(y)))
  out[cbind(x, y)] <- z
  out
})

最佳答案

不需要“reshape”或“reshape2”包。只需使用基础 R reshape()。假设您的 data.frame 名为“temp”:

reshape(temp, direction = "wide", idvar="ID", timevar="Attribute")
#       ID Metric1.1  Metric1.2  Metric1.3
# [1,]   1 -1.636301 -1.1715544         NA
# [2,]   2  1.148329  1.5164278         NA
# [3,]   3  2.168257 -1.0110274         NA
# [4,]   4 -1.182365 -0.9421652         NA
# [5,]   5 -1.363138 -0.2105443         NA
# [11,]  6        NA -0.4143548         NA
# [12,]  7        NA -1.6170975  0.1060407
# [13,]  8        NA  1.2402303  0.9796893
# [14,]  9        NA  0.4460047  0.9254911
# [18,] 10        NA         NA -1.5728600
# [19,] 11        NA         NA -0.8082675
# [20,] 12        NA         NA -1.8643084

如果您的数据是matrix而不是data.frame,则需要在使用之前将其转换为data.frame reshape(),或者您可以使用xtabs()。但是,使用 xtabs() 会创建零而不是 NA。这是 xtabs() 方法:

xtabs(Metric1 ~ ID + Attribute, tempm)
#     Attribute
# ID            1          2          3
#   1  -1.6363007 -1.1715544  0.0000000
#   2   1.1483294  1.5164278  0.0000000
#   3   2.1682566 -1.0110274  0.0000000
#   4  -1.1823649 -0.9421652  0.0000000
#   5  -1.3631378 -0.2105443  0.0000000
#   6   0.0000000 -0.4143548  0.0000000
#   7   0.0000000 -1.6170975  0.1060407
#   8   0.0000000  1.2402303  0.9796893
#   9   0.0000000  0.4460047  0.9254911
#   10  0.0000000  0.0000000 -1.5728600
#   11  0.0000000  0.0000000 -0.8082675
#   12  0.0000000  0.0000000 -1.8643084 

关于r - 在 R 中将行转换为列以进行统计相关性分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14202137/

相关文章:

r - 以最小距离连接矩阵的两个坐标

r - 你如何将类 Eigen::MatrixXd 的对象转换为类 Rcpp::NumericMatrix

php - 多列而不是多行 - PDO 语句

r - 寻找一种使用 ggplot 绘制以下相关数据的方法

r - 是否存在等效于子集运算符 `[ ]` 的 R 函数,以便按行索引进行切片?

R根据应用于多列的多个部分字符串过滤行

MySQL - 仅当所有行都不为空时求和,否则返回空

已使用连接表的语句上的 mySQL 行号生成

numpy - 如何计算一个非常大的相关矩阵

python - 如何使用 Pandas 获取两个时间序列之间的相关性