Заменить на 0 при получении данных из матрицы - PullRequest
0 голосов
/ 23 мая 2019

Я заполняю значения столбца в кадре данных из значений, присутствующих в матрице.Поиск значения выполняется из двух столбцов, называемых e1 и e2.Но возможно, что в любом из этих столбцов содержатся строки, которых нет в матрице.Это, конечно, дает ошибку, но я хотел бы знать, возможно ли продолжить заполнение нулевым несуществующим значением.

x<-cbind(c(0.3,0.35,0.35,0),c(0.2,0.2,0.4,0.2)
,c(0,0.6,0.1,0.3),c(0.5,0.25,0.25,0))
colnames(x) <- c("A","B","C","D")
rownames(x) <- c("A","B","C","D")

y<-as.data.frame(cbind(c(1,2,3,4,5,6)
,c("A","A","B","A","B","A"),c("D","C","C","D","D","J")))
colnames(y) <- c("id","e1","e2")

index_df = y%>% select(e1,e2)
colnames(index_df)<-c('rows','cols')

y$l<-x[as.matrix(index_df)]

Ошибка в x [as.matrix (index_df)]: нижний индекс вне границ

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Мы можем match имена строк и столбцов x с e1 и e2 столбцами y, а затем использовать его для подстановки значений из x.

y$l <- x[cbind(match(y$e1, rownames(x)), match(y$e2, colnames(x)))]

y
#  id e1 e2    l
#1  1  A  D 0.50
#2  2  A  C 0.00
#3  3  B  C 0.60
#4  4  A  D 0.50
#5  5  B  D 0.25
#6  6  A  J   NA

Это вернет NA для несоответствующих значений, которые при необходимости можно изменить на 0, выполнив

y$l[is.na(y$l)] <- 0
0 голосов
/ 23 мая 2019

Нам нужно создать индекс, основанный на вхождении значений с %in%.Здесь «J» не является именем столбца для «x».Таким образом, используя 'i1', мы создаем логический индекс и обновляем только те строки, у которых имена столбцов совпадают с 'e2'.Теперь мы можем напрямую использовать синтаксис OP

i1 <- index_df$cols %in% colnames(x)
y$l[i1] <- x[as.matrix(index_df[i1,])]
y
#  id e1 e2    l
#1  1  A  D 0.50
#2  2  A  C 0.00
#3  3  B  C 0.60
#4  4  A  D 0.50
#5  5  B  D 0.25
#6  6  A  J   NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...