2017-08-06 80 views
-3

假设有一个矩阵 - 'mat',它有115列。根据某些列名的列表对一个矩阵进行子集

还有另一个矩阵 - 'res_mat',它有一列,它有前面矩阵'mat'的38个列名。

我想创建第三个矩阵 - 'fin_mat',它将成为第一个矩阵'mat'的一个子集,其中第一个矩阵的列被存储为第二个矩阵'res_mat'的列中的值。

换句话说,我有一个存储在变量中的列名列表。如何创建包含存储在变量中的列的第一个矩阵的子集?

+0

请检查[mcve]。 –

回答

1

一种方法是使用函数“select”和“one_of”的dplyr包。 One_of允许根据名称选择列(以字符串格式)。

下面是一个简单的虹膜表示例,其中我提取了列名“Sepal.Length”和“Sepal.Width”。

library(dplyr) 

mat1 <- iris 

mat2 <- data.frame(names = c("Sepal.Length", "Sepal.Width")) %>% 
    mutate(names = as.character(names)) #make sure the names are characters 

results <- mat1 %>% select(one_of(mat2$names)) 
+0

感谢您使用此代码。它工作没有任何问题。 –

2

它可以很容易地完成。在下面的代码中,我可以创建一个数据帧mat和另一个res_matmat有数据,res_mat有一列 - select_these_columnsmat数据帧有10列,分别命名为a,b,c,d,e ...,j。 select_thes_colsres_mat有五行,分别为条目a,b,c,d,e。所有需要做的是通过res_mat$select_these_colsmat

a <- (matrix(rnorm(1000), nrow = 100, ncol = 10)) 
mat <- as.data.frame(a) 
names(mat) <- letters[1:10] 
res_mat <- data.frame(x = letters[1:5]) 
names(res_mat) <- 'select_these_cols' 
fin_mat <- mat[res_mat$select_these_cols] # subsetting operation 
+0

你好 感谢您的回复。但是,它没有给我想要的结果。 预期的结果是 西1 - “A” 西3 - “C” 山口4 - “d” 然而,它是给我是 西1 - “A” 西2 - “B “ Col 3 - ”C“ 希望你得到它。 –

3

似乎并不十分困难。如果我正确理解你的问题,这样的事情就可以做到。

# First make up some matrix 
mat <- matrix(1:24, ncol = 6) 
colnames(mat) <- paste0("Col", 1:6) 

# These would be the columns to keep 
res_mat <- matrix(c("Col1", "Col3", "Col4"), ncol = 1) 

fin_mat <- mat[, res_mat[, 1]] 
fin_mat 
+0

你好 感谢您的回复。但是,它没有给我想要的结果。 预期的结果是 西1 - “A” 西3 - “C” 山口4 - “d” 然而,它是给我是 西1 - “A” 西2 - “B “ Col 3 - ”C“ 希望你得到它。 –

相关问题