簡體   English   中英

R使用lapply命名data.frames列表中的colnames和rownames

[英]R name colnames and rownames in list of data.frames with lapply

我非常沮喪,因為我不知道如何在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="")})

但沒有任何反應。 我怎么能實現這一點。 或者是錯誤的方式?

謝謝

您需要記住, lapply中的對象x不是原始對象,而是副本。 更改colnames副本不會影響原來的對象。 您需要返回x才能獲取包含新名稱的對象的新副本。

new_obj = lapply(a, function(x) {
   colnames(x) <- paste("col",1:10,sep="")
   return(x)
  })

在這種情況下,我更喜歡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 rownames和colnames的更通用的解決方案

lapply(datalist, "colnames<-", paste0("col", 1:2))
lapply(datalist, "rownames<-", letters[1:10])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM