R语言中按指定索引提取矩阵wttidy元素时仅返回首列的问题求助
解决矩阵元素批量提取的问题
嘿,作为R新手,你其实没必要写这么复杂的函数——R本身就支持向量化索引,直接一步就能搞定你的需求!
正确的简洁写法
你只需要用cbind()把行索引和列索引组合成一个两列的矩阵,然后直接用这个矩阵去索引你的wttidy矩阵就行:
arrivals$result <- wttidy[cbind(arrivals$letterindex, arrivals$nextvalue)]
这样就能一次性提取所有对应位置的元素,结果会是一个和arrivals行数一致的数值向量,完美符合你的需求。
为什么你的原有代码出问题了?
咱们来拆解一下你写的funx函数:
funx <- function(x){ rowvalue<- data.table(value[x, ]) A<- as.numeric(arrivals$nextvalue[x]) dist<- rowvalue[, A] return(dist) }
这里的问题出在rowvalue[, A]:当你把单行的矩阵切片转成data.table后,用[, A](A是数值)会返回整个第A列的列向量,而不是这一行的第A个元素。哪怕rowvalue只有一行,返回的也是长度为1的列向量,再加上你用lapply()调用这个函数,最终得到的arrivals$result会是一个包含多个单列data.table的列表,而不是你想要的数值。
如果要修正你的原有代码,其实只需要把dist<- rowvalue[, A]改成dist<- rowvalue[[A]](用双括号提取单个元素),或者dist<- rowvalue[, A, drop = TRUE],这样就能得到单个数值,而不是列向量。不过还是推荐最开始说的向量化索引方法,更简洁高效。
补充验证小技巧
你可以先手动测试几个索引,确认结果是否正确:
# 比如取第1行的对应索引元素 wttidy[arrivals$letterindex[1], arrivals$nextvalue[1]] # 和向量化方法的第一个元素对比 wttidy[cbind(arrivals$letterindex, arrivals$nextvalue)][1]
两者应该是一致的,这样就能确认方法的正确性啦。
内容的提问来源于stack exchange,提问作者Manel Fernández
相关产品推荐
相关产品推荐

