为For Loop中的多个矩阵分配相同的列/行名

时间:2018-11-27 14:27:05

标签: r for-loop names

我有一堆矩阵,我想根据我拥有的数据帧(月)中另一列(名称)中保存的一列名称来为其分配列和行名称。

我想为每个矩阵分配名称,以对应于此处保存的连接的“伙伴”字符串和度量。其中一个矩阵称为“ facebook_Total_Completed_Rentals”:

Metrics = c('_Total_Completed_Rentals','_Registered_Completed_rentals',
'_Registered_renters','_New_Registrations')

Partners = c('facebook', 'altrooz', 'adperio', 'snapchat', 'apple', 'google')    

我想通过这两种方法循环遍历,以这种方式将名称分配给矩阵,从而避免手动编码所有colnames和row.names语句:

for(i in 1:length(Metrics)){
  for(j in 1:length(Partners)){
  temp = paste0(Partners[j],Metrics[i])
  colnames(temp)= months$Names[1:(months_cut-1)]
  row.names(temp) = months$Names[1:(months_cut-1)]
  }
}  

但是我得到了错误:

Error in `colnames<-`(`*tmp*`, value = months$Names[1:(months_cut - 1)]) : 
attempt to set 'colnames' on an object with less than two dimensions

请帮助

2 个答案:

答案 0 :(得分:1)

请考虑以下data.frames:

iris_a  <- iris[1:2,]
iris_b  <- iris[3:4,]
iris_c  <- iris[5:6,]

做您想要的事情的简单方法是将它们放在列表中并对其进行更改:

rnms <- c("foo","bar")
your_list <- lapply(list(iris_a = iris_a,iris_b = iris_b, iris_c = iris_c), function(x){
  rownames(x) <- rnms
  x
})

然后,如有必要,您可以将其元素提取回本地环境:

list2env(your_list, environment())
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# foo          5.1         3.5          1.4         0.2  setosa
# bar          4.9         3.0          1.4         0.2  setosa

使用tidyverse更紧凑:

your_list <- map(lst(iris_a, iris_b, iris_c), `rownames<-`, rnms)

答案 1 :(得分:0)

虽然@Moody的答案可能是更干净的选项,但我认为我会提供可以执行您最初希望执行的操作的代码:

让我们创建4个矩阵,它们的名称是2个元素的组合:

a_1 <- a_2 <- b_1 <- b_2 <- matrix(1:20, ncol = 5)

行名和列名的向量:

rnames <- paste0("row_", 1:4)
cnames <- paste0("col_", 1:5)

获取名称元素:

x <- c("a", "b")
y <- 1:2

对于循环,您需要意识到temp只是一个字符串,因此colnames(temp)将不起作用。您想要创建一个包含整个命令的字符串,将其解析为一个表达式,然后对其求值:

for (i in x) {
  for (j in y) {
    temp <- paste(i, j, sep = "_")
    eval(parse(text = paste0("dimnames(", temp, ") <- list(rnames, cnames)")))
  }
}

注意。 dimnames(temp)rownamescolnames快。