1

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

我要为其分配名称的每个矩阵都对应于一个连接的“合作伙伴”字符串和此处保存的度量,例如其中一个矩阵称为“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

请帮忙

4

2 回答 2

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)
于 2018-11-27T14:45:35.163 回答
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)rownames和快colnames

于 2018-11-27T15:01:14.747 回答