在R中将列名和第一行拼接起来

3

我有一个有3列的数据框

data.frame(A=c(1, 2, 3), B=c('a', 'b', 'c'), C=c(22, 21, 22))

我希望能够将第一行与列名组合为最终列名,因此A列将命名为“A_1”,并且将具有值(a、22)等等... 有人可以帮我吗?
[EDIT - ANSWER] 我使用以下方式解决了这个问题: columns = paste(names(df),as.matrix(df[1,])) columns %>% str_remove(' NA') # 去除第一行中的“NA” colnames(df) = columns 数据集截图 pseudospin输出

3
你能清晰地展示你期望的输出结果吗? - Karthik S
你可以使用:paste0(names(df),'_',df[1,,drop = T])获取列名,但不确定你想要什么? - Karthik S
列A将被称为“A_1”,这是原始名称“A”与列A的第一行元素(值1)连接而成,而第一行之后的行将继续使用它们的值。这样是否更清晰?如果不清楚,我可以尝试发布一些图片或更好地解释。 - user8419142
@KarthikS 之后,我希望我的原始数据框具有“新”列名称作为列名称,因此只需将您的输出添加到原始数据框中即可。问题是第一行也有像“A”这样的字母,但使用您的代码它们不是作为字母而是作为数字添加(奇怪!) - user8419142
2个回答

5
可能存在行和列的混淆?这是你的意思吗?
df <- data.frame(A=c(1, 2, 3), B=c('a', 'b', 'c'), C=c(22, 21, 22))
colnames(df) <- paste(sep = '_', colnames(df), as.character(unlist(df[1,])))
df <- df[-1, ]
df
#>   A_1 B_a C_22
#> 2   2   b   21
#> 3   3   c   22

它正在将符号转换为数字。我已经更新了问题,并附上了您代码在我的数据中的输出。请检查一下,好吗? - user8419142
啊,我现在明白你的意思了。那些以数字形式呈现的列是因为它们被存储为“因子”。我修改了我的答案来处理这个问题。 - pseudospin
你还需要小心处理其余的数据 - 它看起来像是数字,但因为它作为一个因子被读入,它并不像表面上那样,计算结果可能会出现奇怪的答案。 - pseudospin
仍然无法工作 :( 仍然显示数字而不是“%”或“mg”。 - user8419142
列 = paste(names(df),as.matrix(df[1,])) colnames(df) = 列 这个可以!现在我需要忽略“NA”值。 - user8419142
谢谢,我已经做好了!它在帖子的编辑中 :) 感谢您的帮助,这很重要!!! - user8419142

1
我认为这可能会解决你的问题:

library(dplyr)
library(stringr)

df = data.frame('A' = c(NA, 1, 2),
                'B' = c('%', 6.49, 6.42),
                'C' = c('mg/l', 5.7, 8.4))
cols = df %>%
  colnames() %>%
  paste(df[1, ], sep = '_') %>%
  str_remove('_NA')

df %>%
  'colnames<-'(cols) %>%
  slice(-1) %>%
  apply(2, as.numeric) %>%
  as.data.frame()

这里是输出:
  A  B_% C_mg/l
1 1 6.49    5.7
2 2 6.42    8.4

请注意,清除列名中的NA值非常重要,以保持其干净。

你好!非常感谢您的回答!实际上,我不想让列具有“1:ncol(.)”,而是要使用数据框的第一行。在我提供的示例中,我放置了1、2、3,但我的数据在第一行中有像“%”或“mg”这样的值。 - user8419142
第一行的值是什么? - rodolfoksveiga
这是来自一个csv文件的内容,其中“,”是分隔符:,,,,,,,,%,毫克/升,毫克/升,毫克/升,%,毫克/千克,毫克/千克,%,毫克/千克,毫克/千克,毫克/千克,毫克/千克,毫克/千克,%,毫克/千克,毫克/千克,毫克/千克,%,毫克/千克,毫克/千克,%,毫克/千克,毫克/千克,%,毫克/千克,毫克/千克,%,毫克/千克,毫克/千克,毫克/千克,毫克/千克,毫克/千克,毫克/千克,毫克/千克,毫克/千克,毫克/千克,毫克/千克,毫克/千克,毫克/千克 - user8419142
列 = paste(names(df),as.matrix(df[1,])) colnames(df) = 列 这个可以用!现在我需要忽略“NA”值。 - user8419142
1
谢谢,我已经做好了!它在帖子的编辑中 :) 感谢您的帮助,非常重要!!! - user8419142
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接