Добавить имя столбца в качестве префикса для определенных столбцов - PullRequest
0 голосов
/ 21 января 2019

У меня есть фрейм данных:

    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)

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Попробуйте использовать 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
0 голосов
/ 21 января 2019

Мы можем использовать 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().

...