使用特定值从相关矩阵中提取行名和列名
extract rownames and column names from correlation matrix using aspecefic value
我的目标是消除数据集中的重复项。
为此,我编写了一个计算相关性的程序。
我想取相关性高于我确定的特定值的变量的名称。
这是我得到的结果之一。
M926T709 M927T709_1 M927T709_2 M929T709
M926T709 1.0000000 0.9947082 0.9879702 0.8716944
M927T709_1 0.9947082 1.0000000 0.9955145 0.8785669
M927T709_2 0.9879702 0.9955145 1.0000000 0.8621052
M929T709 0.8716944 0.8785669 0.8621052 1.0000000
假设我想获取百分比高于 95% 的变量的名称
所以我应该得到这个结果
M926T709 , M927T709_1 , M927T709_2
编辑:Ronak Shah 给出的答案效果很好,但我需要将结果作为向量获取,以便我可以使用
之后的名称
注意,我不应该分析正交结果,因为它们总是等于 1。
如果您需要任何说明,请告诉我,如果您想查看我的整个程序,请告诉我。
示例数据:limit
和相关矩阵 m
(为演示目的添加负相关):
limit <- 0.95
m <- as.matrix( read.table(text = "
M926T709 M927T709_1 M927T709_2 M929T709
M926T709 1.0000000 -0.9947082 0.9879702 0.8716944
M927T709_1 -0.9947082 1.0000000 0.9955145 0.8785669
M927T709_2 0.9879702 0.9955145 1.0000000 0.8621052
M929T709 0.8716944 0.8785669 0.8621052 1.0000000"))
创建所需矩阵的子集并提取 row/column 个名称。
Target <- unique( # Remove any duplicates
unlist( # merge subvectors of the `dimnames` list into one
dimnames( # gives all names of rows and columns of the matrix below
# Create a subset of the matrix that ignores correlations < limit
m[rowSums(abs(m) * upper.tri(m) > limit) > 0, # Rows
colSums(abs(m) * upper.tri(m) > limit) > 0] # Columns
),
recursive = FALSE))
Target
#> [1] "M926T709" "M927T709_1" "M927T709_2"
由 reprex package (v2.0.1)
于 2021-10-25 创建
使用 rowSums
和 colSums
您可以分别计算每行和每列中有多少个值大于 0.95,然后 return 名称。
tmp <- mat > 0.95
diag(tmp) <- FALSE
names(Filter(function(x) x > 0, rowSums(tmp) > 0 | colSums(tmp) > 0))
#[1] "M926T709" "M927T709_1" "M927T709_2"
我的目标是消除数据集中的重复项。
为此,我编写了一个计算相关性的程序。
我想取相关性高于我确定的特定值的变量的名称。
这是我得到的结果之一。
M926T709 M927T709_1 M927T709_2 M929T709
M926T709 1.0000000 0.9947082 0.9879702 0.8716944
M927T709_1 0.9947082 1.0000000 0.9955145 0.8785669
M927T709_2 0.9879702 0.9955145 1.0000000 0.8621052
M929T709 0.8716944 0.8785669 0.8621052 1.0000000
假设我想获取百分比高于 95% 的变量的名称
所以我应该得到这个结果
M926T709 , M927T709_1 , M927T709_2
编辑:Ronak Shah 给出的答案效果很好,但我需要将结果作为向量获取,以便我可以使用
之后的名称注意,我不应该分析正交结果,因为它们总是等于 1。
如果您需要任何说明,请告诉我,如果您想查看我的整个程序,请告诉我。
示例数据:limit
和相关矩阵 m
(为演示目的添加负相关):
limit <- 0.95
m <- as.matrix( read.table(text = "
M926T709 M927T709_1 M927T709_2 M929T709
M926T709 1.0000000 -0.9947082 0.9879702 0.8716944
M927T709_1 -0.9947082 1.0000000 0.9955145 0.8785669
M927T709_2 0.9879702 0.9955145 1.0000000 0.8621052
M929T709 0.8716944 0.8785669 0.8621052 1.0000000"))
创建所需矩阵的子集并提取 row/column 个名称。
Target <- unique( # Remove any duplicates
unlist( # merge subvectors of the `dimnames` list into one
dimnames( # gives all names of rows and columns of the matrix below
# Create a subset of the matrix that ignores correlations < limit
m[rowSums(abs(m) * upper.tri(m) > limit) > 0, # Rows
colSums(abs(m) * upper.tri(m) > limit) > 0] # Columns
),
recursive = FALSE))
Target
#> [1] "M926T709" "M927T709_1" "M927T709_2"
由 reprex package (v2.0.1)
于 2021-10-25 创建使用 rowSums
和 colSums
您可以分别计算每行和每列中有多少个值大于 0.95,然后 return 名称。
tmp <- mat > 0.95
diag(tmp) <- FALSE
names(Filter(function(x) x > 0, rowSums(tmp) > 0 | colSums(tmp) > 0))
#[1] "M926T709" "M927T709_1" "M927T709_2"