添加列名作为特定列的前缀

Posted

技术标签:

【中文标题】添加列名作为特定列的前缀【英文标题】:Add column name as prefix for specific columns 【发布时间】:2019-01-21 20:15:41 【问题描述】:

我有一个数据框:

    df = read.table(text="race  Chr1    Chr08   Chr11   rep1    rep2    rep3    rep4    rep5
    race1   P54 P88 P54 151 142 267 127 161
    race1   P54 P88 P88 131 203 120 300 223
    race1   P54 P54 P88 165 271 73  170 241
    race1   P54 P54 P54 206 235 76  67  159", header=T, stringsAsFactors=F)

我想添加列名作为列 2:4 的前缀,我尝试在循环中“粘贴”或应用。要么不行。

for (i in 2:4)
  df[i] <- paste(names(df[i]),df[i],sep=".")

df[2:4] <- apply(df[2:4],2, function(x) paste(colnames(x),x, sep="."))

预期结果:

        result = read.table(text="race  Chr1    Chr08   Chr11   rep    rep2 rep3    rep4    rep5
race1   Chr1.P54    Chr08.P88   Chr11.P54   151 142 267 127 161
race1   Chr1.P54    Chr08.P88   Chr11.P88   131 203 120 300 223
race1   Chr1.P54    Chr08.P54   Chr11.P88   165 271 73  170 241
race1   Chr1.P54    Chr08.P54   Chr11.P54   206 235 76  67  159", header=T, stringsAsFactors=F)

感谢您的帮助。

【问题讨论】:

【参考方案1】:

我们可以使用col() 来获取这些列的名称矩阵,然后在我们将它们强制转换为矩阵后将其粘贴到列上。

df[2:4] <- paste(col(df[2:4], TRUE), as.matrix(df[2:4]), sep=".")
df
#    race     Chr1     Chr08     Chr11 rep1 rep2 rep3 rep4 rep5
# 1 race1 Chr1.P54 Chr08.P88 Chr11.P54  151  142  267  127  161
# 2 race1 Chr1.P54 Chr08.P88 Chr11.P88  131  203  120  300  223
# 3 race1 Chr1.P54 Chr08.P54 Chr11.P88  165  271   73  170  241
# 4 race1 Chr1.P54 Chr08.P54 Chr11.P54  206  235   76   67  159

您也可以运行 rep(names(df[2:4]), each=nrow(df)) 代替 col()

【讨论】:

【参考方案2】:

尝试使用lapplygrep。此解决方案首先识别数据框中以Chr 开头的列名。然后,它使用 lapplyseq_along 将该列名称添加到匹配列。

df <- data.frame(v1=c(1:3), ChrBlah=c(4:6), BlahChr=c(7:9), Chr2=c(1:3))
names <- names(df)[grep("^Chr", names(df))]
df[names] <- lapply(seq_along(df[names]), function(y, n, i) 
    paste0(n[[i]], ".", y[[i]]), y=df[names], n=names(df[names]))

df

  v1   ChrBlah BlahChr   Chr2
1  1 ChrBlah.4       7 Chr2.1
2  2 ChrBlah.5       8 Chr2.2
3  3 ChrBlah.6       9 Chr2.3

【讨论】:

以上是关于添加列名作为特定列的前缀的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用pad函数向dataframe特定数据列的每个字符串添加前置(前缀)补齐字符或者字符串向所有字符串的左侧填充直到宽度达到指定要求(left padding)

对列名排序后转置和添加前缀的宏

pandas使用pad函数向dataframe特定数据列的每个字符串添加前置(前缀)补齐字符或者字符串向所有字符串的左侧填充直到宽度达到指定要求(left padding)

如何通过添加另一列的前缀来创建触发器以更新列

使用 dplyr 复制一列并为 R 中的新列添加前缀

自动为@Embeddable类的列名添加前缀