我正在从矩阵中存在的值中填充数据框中的一列值。从称为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)]
的两列中进行值的搜索。但是有可能在任何这些列中包含矩阵中不存在的字符串。这当然会产生错误,但是我想知道是否有可能继续用那个不存在的值0填充。
secrets.yaml
x [as.matrix(index_df)]中的错误:下标超出范围
答案 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