我非常沮丧,因为我不知道如何在data.frames列表中实现列和行的命名。我的意思是我想避免使用循环。所以我想我可以使用lapply。 好的,我首先得到以下列表:
>a
$nem.greedyMAP.FALSE.POS
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1 NA NA NA NA NA NA NA NA NA NA
2 NA NA NA NA NA NA NA NA NA NA
3 NA NA NA NA NA NA NA NA NA NA
4 NA NA NA NA NA NA NA NA NA NA
5 NA NA NA NA NA NA NA NA NA NA
6 NA NA NA NA NA NA NA NA NA NA
7 NA NA NA NA NA NA NA NA NA NA
8 NA NA NA NA NA NA NA NA NA NA
9 NA NA NA NA NA NA NA NA NA NA
10 NA NA NA NA NA NA NA NA NA NA
$nem.greedyMAP.FALSE.NEG
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1 NA NA NA NA NA NA NA NA NA NA
2 NA NA NA NA NA NA NA NA NA NA
3 NA NA NA NA NA NA NA NA NA NA
4 NA NA NA NA NA NA NA NA NA NA
5 NA NA NA NA NA NA NA NA NA NA
6 NA NA NA NA NA NA NA NA NA NA
7 NA NA NA NA NA NA NA NA NA NA
8 NA NA NA NA NA NA NA NA NA NA
9 NA NA NA NA NA NA NA NA NA NA
10 NA NA NA NA NA NA NA NA NA NA
当然这个名单要大得多,否则我不值得这么麻烦。 但是,我想重命名所有data.frames的列和行相同。 所以我虽然可以使用:
lapply(a, function(x) {colnames(x) <- paste("col",1:10,sep="")})
但没有任何反应。我怎么能实现这一点。或者是错误的方式?
由于
答案 0 :(得分:11)
您需要记住x
内的对象lapply
不是原始对象,而是副本。更改副本的colnames
不会影响原始对象。您需要返回x
才能获取包含新名称的对象的新副本。
new_obj = lapply(a, function(x) {
colnames(x) <- paste("col",1:10,sep="")
return(x)
})
答案 1 :(得分:10)
在这种情况下我会更喜欢setNames
set.seed(1)
datalist <- list(dat1 = data.frame(A = 1:10, B = rnorm(10)),
dat2 = data.frame(C = 100:109, D = rnorm(10))
)
lapply(datalist, names)
## $dat1
## [1] "A" "B"
## $dat2
## [1] "C" "D"
datalist <- lapply(datalist, setNames, paste0("col", 1:2))
lapply(datalist, names)
## $dat1
## [1] "col1" "col2"
## $dat2
## [1] "col1" "col2"
编辑
修改list
lapply(datalist, "colnames<-", paste0("col", 1:2))
lapply(datalist, "rownames<-", letters[1:10])