从矩阵检索数据时替换为0

时间:2019-05-23 00:11:44

标签: r matrix

我正在从矩阵中存在的值中填充数据框中的一列值。从称为e2x<-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)] 的两列中进行值的搜索。但是有可能在任何这些列中包含矩阵中不存在的字符串。这当然会产生错误,但是我想知道是否有可能继续用那个不存在的值0填充。

secrets.yaml
  

x [as.matrix(index_df)]中的错误:下标超出范围

2 个答案:

答案 0 :(得分:1)

我们可以将match的行名和列名与x的{​​{1}}和e1列一起e2,然后使用它来对{{ 1}}。

y

这将为不匹配的值返回x,如果需要,可以将其更改为0

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

答案 1 :(得分:0)

我们需要根据%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