簡體   English   中英

根據 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM