如何在数据框列表中将列更改为行名

问题描述

我有一个数据帧列表,我想将一列更改为行名,因为我需要转置每个数据帧。

对于一些虚拟数据,这是我正在使用的代码

x <- c("A","B","C","D","E")
y <- c(1:5)
z <- c(6:10)

df1 <- data.frame("Row One"=x,"Row Two"=y)
df2 <- data.frame("Row One"=x,"Row Two"=z)
dfList <- list(df1,df2)

我很幸运,没有运气。

dfList <- lapply(dfList,column_to_rownames("Row One"))

也不使用for循环。

for(i in length(dfList)){
  dfList[i] <- column_to_rownames(dfList[i],"Row One") 
}

根据错误消息,我尝试将as.data.frame添加到list元素中,但这也不起作用。

for(i in length(dfList)){
      dfList[i] <- column_to_rownames(as.data.frame(dfList[i],"Row One")) 
    }

关于最后一个奇怪的事情是错误:“在Row One中找不到列.data。”

解决方法

实际上,您使用 lapply() 的方法是正确的。您犯的唯一错误是在列名中使用了空格。这样,R 内部会在您看到空间的地方放一个点!

引用您的示例,如果您检查 df1 的列名称,您会看到

> colnames(df1)
[1] "Row.One" "Row.Two"

这是您的 lapply() 命令无法执行的原因之一。另一个错误是您没有在 column_to_rownames() 命令中指定数据,即 lapply(dfList,column_to_rownames("Row One")) 是错误的,但 lapply(dfList,function(x) column_to_rownames(x,var = "Row One")) 是正确的。

通过这些更正,有效的代码是

dfList <- lapply(dfList,var = "Row.One"))

但是请注意,现在您获得了 data.frames

> dfList
[[1]]
  Row.Two
A       1
B       2
C       3
D       4
E       5

[[2]]
  Row.Two
A       6
B       7
C       8
D       9
E      10

也就是说,您删除了第一列并将其指定为行名。如果您想保留第一列设置行名,您可以这样做

dfList2 <- lapply(dfList,function(x){rownames(x) <- x[,1]; x})

输出

> dfList2
[[1]]
  Row.One Row.Two
A       A       1
B       B       2
C       C       3
D       D       4
E       E       5

[[2]]
  Row.One Row.Two
A       A       6
B       B       7
C       C       8
D       D       9
E       E      10