添加列名作为特定列的前缀
Add column name as prefix for specific columns
我有一个数据框:
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 的前缀,我在循环中尝试了 "paste" 或应用。两者都不行。
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)
感谢您的帮助。
我们可以使用 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()
。
尝试将 lapply
与 grep
一起使用。此解决方案首先识别数据框中以 Chr
开头的列名称。然后它使用 lapply
和 seq_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
我有一个数据框:
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 的前缀,我在循环中尝试了 "paste" 或应用。两者都不行。
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)
感谢您的帮助。
我们可以使用 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()
。
尝试将 lapply
与 grep
一起使用。此解决方案首先识别数据框中以 Chr
开头的列名称。然后它使用 lapply
和 seq_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