我有一堆矩阵,我想根据我拥有的数据帧(月)中另一列(名称)中保存的一列名称来为其分配列和行名称。
我想为每个矩阵分配名称,以对应于此处保存的连接的“伙伴”字符串和度量。其中一个矩阵称为“ 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
请帮助
答案 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)
比rownames
和colnames
快。