【发布时间】:2014-01-24 05:16:55
【问题描述】:
转换数据框后,我想根据现有行为列分配头/名称。 我的标题目前是:
row.names X2 X3 X4 X5 X6 X7 X8 X9 ...
我想摆脱它并使用下一行作为列标题(因为我有很多,所以不必输入它们)。
对此我唯一的解决方案是导出并重新加载数据(使用 header=T)。
【问题讨论】:
转换数据框后,我想根据现有行为列分配头/名称。 我的标题目前是:
row.names X2 X3 X4 X5 X6 X7 X8 X9 ...
我想摆脱它并使用下一行作为列标题(因为我有很多,所以不必输入它们)。
对此我唯一的解决方案是导出并重新加载数据(使用 header=T)。
【问题讨论】:
试试这个:
colnames(DF) = DF[1, ] # the first row will be the header
DF = DF[-1, ] # removing the first row.
但是,请查看数据是否已正确读取。如果您的 data.frame 有数字变量但第一行是字符,则所有数据都已被读取为字符。为避免此问题,最好按照您的建议保存数据并使用 header=TRUE 再次读取。你也可以看看这个问题:Reading a CSV file organized horizontally。
【讨论】:
这里的关键是先取消列出该行。
colnames(DF) <- as.character(unlist(DF[1,]))
DF = DF[-1, ]
【讨论】:
与 Vishnu 的答案非常相似,但使用 lapply 将所有数据映射到字符,然后将它们分配为标题。如果您的数据作为因子导入,这将非常有用。
DF[] <- lapply(DF, as.character)
colnames(DF) <- DF[1, ]
DF <- DF[-1 ,]
请注意,如果您需要大量数字数据或因子,则需要将它们转换回来。在这种情况下,存储字符数据框,提取所需的行,然后将其应用于原始数据框可能是有意义的
tempDF <- DF
tempDF[] <- lapply(DF, as.character)
colnames(DF) <- tempDF[1, ]
DF <- DF[-1 ,]
tempDF <- NULL
【讨论】:
使用 dplyr 和 tidyr 的新答案:
提取所需的列名并转换为列表
library(tidyverse)
col_names <- raw_dta %>%
slice(2) %>%
pivot_longer(
cols = "X2":"X10", # until last named column
names_to = "old_names",
values_to = "new_names") %>%
pull(new_names)
删除不正确的行并添加正确的列名
dta <- raw_dta %>%
slice(-1, -2) %>% # Removes the rows containing new and original names
set_names(., nm = col_names)
【讨论】:
最简洁的方法是使用专门为此目的构建的janitor 包的功能。
janitor::row_to_names(DF,1)
如果您想使用除第一行之外的任何其他行,请将其传递到第二个参数中。
【讨论】: