【问题标题】:Create header of a dataframe from the first row in the data frame从数据帧的第一行创建数据帧的标题
【发布时间】:2014-03-28 13:55:56
【问题描述】:

假设我有一个数据框:

a <- data.frame(a=c("f", 2, 3), b=c("g", 3, 7), c=c("h", 2, 4))

我想从第一行创建列名。我的猜测是:

names(a) <- a[1,]

给出:

names(a)
[1] "3" "3" "3"

我没有完全了解正在发生的事情。任何人都可以解释并帮助我如何正确地做到这一点吗?

【问题讨论】:

  • 不知道为什么.. 但你可以将a[1, ] 包裹在unlist()
  • 为什么会有这个data.frame?看起来应该在数据导入/创建期间解决的问题。
  • @Roland 我导入了一个包含因子和数值数据的 csv。因此我不能使用矩阵......如果这是你的意思。
  • 如果您导入 CSV,read.csv 应该会识别列标题。
  • 是的。但第一行不包含实际的标题,而是元数据-blabla。我必须清理不良的二级数据。

标签: r indexing


【解决方案1】:
janitor::row_to_names(a,1)

janitor 包提供了将任何数据行作为列名向上移动的最简洁方法。

【讨论】:

    【解决方案2】:

    a 的列是因子,每列具有不同的水平。 R 将它们转换为整数。因为,对于每一列,字母按字母数字顺序出现在最后,因此它被赋值为 3。

    试试

    names(a) = as.character(unlist(a[1,]))
    names(a)
    

    【讨论】:

    • as.character 在这个答案中做了什么?
    • 没什么!完全没有它也可以工作!
    • 似乎names() 将因子转换为字符本身
    • ... 不幸的是,这个答案与 Jilber 的相同,在您之前发布了几分钟,并且作为 rawr 在 cmets 中某个时间点发布的答案.. . 哦好吧....
    • 好吧,你救了我的命……但是这里发生了什么?我正在清理一个大的 Excel 文件,这个例子对我没有帮助..
    【解决方案3】:

    试试这个:

    > colnames(a) <- unlist(a[1,])
    > a
      f g h
    1 f g h
    2 2 3 2
    3 3 7 4
    

    【讨论】:

    • 我认为这里不需要droplevels,是吗?
    • 你是对的@AnandaMahto,现在是上午 8 点 20 分,现在考虑 R 还为时过早,需要喝杯咖啡,感谢您指出这一点。
    • 对于像我这样的人来说是晚上 8 点,也许来不及考虑 R :-)
    猜你喜欢
    • 2023-01-08
    • 2022-08-12
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多