首页 > 解决方案 > 使用`lapply`重命名列表中的选定列

问题描述

我试图了解如何在 Lapply 函数中创建迭代,并且在尝试重命名列表中的列时遇到问题。请参阅下面的可重现示例。

df1 <- data.frame(fruit=c("apple", "Orange", "Pear"), location = c("Japan", "China", "Nigeria"), price = c(32,53,12))
df2 <- data.frame(grocery = c("Durian", "Apple", "Watermelon"), 
                  place=c("Korea", "Japan", "Malaysia"), 
                  name = c("Mark", "John", "Tammy"), 
                  favourite.food = c("Apple", "ORANGE", "Cakes"), 
                  invoice = c("XD1", "XD2", "XD3"))
df3 <- data.frame(address=c("address1", "address2", "address3"), location = c("USA", "UK", "China"))

allobj <- ls()[sapply(ls(),function(t) is.data.frame(get(t)))]
templist <- list(df1, df2, df3)

通过一个简单的 for 循环,我可以重命名每个数据框中的列名

for (i in seq_along(templist)){
  colnames(templist[[i]]) <- c(paste0("From ", allobj[1]) , paste0("From ", allobj[i+1])) #will change the column name of each dataframe in a list in seq
}

但是使用 lapply,我无法更改每个数据框的第 2 列。有人可以指出我的错误吗?谢谢!

lapply(seq_along(templist), function(x) {
  i <- seq_along(templist)
  names(x)[2] <- allobj[i]
  x
})

预期产出

[[1]]
   fruit     df1     price
1  apple    Japan    32
2 Orange    China    53
3   Pear  Nigeria    12

[[2]]
     grocery    df2    name favourite.food invoice
1     Durian    Korea  Mark          Apple     XD1
2      Apple    Japan  John         ORANGE     XD2
3 Watermelon Malaysia Tammy          Cakes     XD3

[[3]]
   address     df3
1 address1      USA
2 address2       UK
3 address3    China

标签: rlapply

解决方案


在这种情况下,我建议mapply改用

mapply(function(x, y) {names(x)[2] <- y; x}, templist, allobj)

#[[1]]
#   fruit     df1 price
#1  apple   Japan    32
#2 Orange   China    53
#3   Pear Nigeria    12

#[[2]]
#     grocery      df2  name favourite.food invoice
#1     Durian    Korea  Mark          Apple     XD1
#2      Apple    Japan  John         ORANGE     XD2
#3  Watermelon Malaysia Tammy         Cakes     XD3

#[[3]]
#   address   df3
#1 address1   USA
#2 address2    UK
#3 address3 China

如果你想使用lapply,你可以使用作为x子集的索引,因为对于第一个列表,我们想要从第一个值的名称,对于第二个列表,我们想要第二个值等等。templistallobjallobjallobj

lapply(seq_along(templist), function(x) {
   names(templist[[x]])[2] <- allobj[x]
   templist[[x]]
 })

推荐阅读