[英]assign headers based on existing row that is not the same row and column / dataframe in R
[英]assign headers based on existing row in dataframe in R
轉換數據框后,我想根據現有行為列分配標題/名稱。 我的標題目前是:
row.names X2 X3 X4 X5 X6 X7 X8 X9 ...
我想擺脫它並使用以下行作為列標題(因為我有很多,所以不必輸入它們)。
我對此的唯一解決方案是導出並重新加載數據(使用 header=T)。
這里的關鍵是首先取消列出該行。
colnames(DF) <- as.character(unlist(DF[1,]))
DF = DF[-1, ]
試試這個:
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同盟。
最干凈的方法是使用專為此目的而構建的janitor
包的功能。
janitor::row_to_names(DF,1)
如果要使用除第一行之外的任何其他行,請將其傳遞到第二個參數中。
與毗濕奴的回答非常相似,但使用 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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.