Замена значений в кадре данных на строку в R - PullRequest
0 голосов
/ 09 ноября 2018

Есть ли способ в R заменить значения в каждой строке матрицы / кадра данных конкретным значением из этой строки?

Например, у меня есть следующая матрица:

df<-cbind(c("A","C","G","T"),c("T","G","C","A"),c(0,1,0,1),c(1,0,1,0),c(0,1,0,1))

df
#     [,1] [,2] [,3] [,4] [,5]
#[1,] "A"  "T"  "0"  "1"  "0"
#[2,] "C"  "G"  "1"  "0"  "1"
#[3,] "G"  "C"  "0"  "1"  "0"
#[4,] "T"  "A"  "1"  "0"  "1"

и я хочу заменить нули в каждой строке соответствующей буквой из первого столбца этой строки, чтобы новая матрица выглядела следующим образом:

newdf
#     [,1] [,2] [,3] [,4] [,5]
#[1,] "A"  "T"  "A"  "1"  "A"
#[2,] "C"  "G"  "1"  "C"  "1"
#[3,] "G"  "C"  "G"  "1"  "G"
#[4,] "T"  "A"  "1"  "T"  "1"

Самое близкое, что мне удалось получить, это следующие команды, но он не заменяет нули правильными значениями из столбца 1.

df[df==0]<-NA
df[, 3:ncol(df)][is.na(df[, 3:ncol(df)])] <- df[,1]

1 Ответ

0 голосов
/ 09 ноября 2018

Мы можем повторить первый столбец, чтобы сделать длины равными, а затем выполнить назначение на основе логической матрицы. Это будет подмножество элементов, которые имеют ту же длину, что и в rhs

i1 <- df == 0
newdf <- df
newdf[i1] <- df[,1][row(df)][i1]
newdf
     [,1] [,2] [,3] [,4] [,5]
#[1,] "A"  "T"  "A"  "1"  "A" 
#[2,] "C"  "G"  "1"  "C"  "1" 
#[3,] "G"  "C"  "G"  "1"  "G" 
#[4,] "T"  "A"  "1"  "T"  "1" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...