【问题标题】:assign headers based on existing row in dataframe in R根据R中数据框中的现有行分配标题
【发布时间】:2014-01-24 05:16:55
【问题描述】:

转换数据框后,我想根据现有行为列分配头/名称。 我的标题目前是:

row.names   X2  X3  X4  X5  X6  X7  X8  X9  ...

我想摆脱它并使用下一行作为列标题(因为我有很多,所以不必输入它们)。

对此我唯一的解决方案是导出并重新加载数据(使用 header=T)。

【问题讨论】:

    标签: r dataframe names


    【解决方案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 organized horizontally

    【讨论】:

    • 我必须在加载数据后对其进行转换,这会将所有内容转换为字符矩阵。想知道我是否可以将其转换回带有标题的数字数据帧而无需导出/重新加载..
    • 如果我在转置之前分配标题,它会起作用。但现在我所有的数值都是字符.. 寻找一种有效的方法将它们转换为数字而不必调用每一列。谢谢
    • 你也可以看到这个问题:stackoverflow.com/questions/17288197/…
    • (对不起,我不确定如何修改上面的问题)问题:将字符矩阵转换为数据框后,我希望列恢复到它们的初始性质(数字,因素等),而不必单独调用它们。我发现的唯一选择是导出并重新加载数据。谢谢
    【解决方案2】:

    这里的关键是先取消列出该行。

    colnames(DF) <- as.character(unlist(DF[1,]))
    DF = DF[-1, ]
    

    【讨论】:

      【解决方案3】:

      与 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
      

      【讨论】:

        【解决方案4】:

        使用 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)
        
        

        【讨论】:

          【解决方案5】:

          最简洁的方法是使用专门为此目的构建的janitor 包的功能。

          janitor::row_to_names(DF,1)
          

          如果您想使用除第一行之外的任何其他行,请将其传递到第二个参数中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-08-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-12-01
            • 2020-05-11
            相关资源
            最近更新 更多