我有一个数据帧列表,我想将一列更改为行名,因为我需要转置每个数据帧。
对于一些虚拟数据,这是我正在使用的代码:
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
。”
答案 0 :(得分:0)
实际上,您使用 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, function(x) column_to_rownames(x, var = "Row.One"))
但是请注意,现在您获得了 data.frame
s
> 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