在数据框中使用mapply实现间接寻址的方法问询
用mapply实现数据框索引匹配新增列
没问题,这就帮你搞定这个需求!先理清楚你的场景:
原始数据框
d1
keystr keynum
1 abc 5
2 def 2
3 def 7
4 abc 3
d2
HD 2 3 5 7
1 abc H I J K
2 def L M N P
预期结果
d1
keystr keynum val
1 abc 5 J
2 def 2 L
3 def 7 P
4 abc 3 I
解决方案代码
核心思路是利用mapply遍历d1的每一对keystr和keynum,同时把d2的行名设置为HD列的值,方便直接用字符串索引行,代码如下:
# 将d2的行名设置为HD列的内容,便于通过keystr定位行 rownames(d2) <- d2$HD # 使用mapply遍历keystr和keynum,提取对应单元格的值 d1$val <- mapply(function(k_str, k_num) { # 把keynum转为字符,匹配d2的列名(列名是字符类型的"2""3"等) d2[k_str, as.character(k_num)] }, d1$keystr, d1$keynum)
代码说明
- 第一步给
d2设置行名,这样我们可以直接用d1$keystr里的abc/def作为行索引,不用再额外查找行位置; mapply会逐个取出d1$keystr和d1$keynum的元素对,传给匿名函数:把数字类型的keynum转为字符(因为d2的列名是字符串格式),然后从d2中提取对应行和列的单元格值;- 最终所有提取出的值会被组合成一个向量,赋值给
d1$val,就能得到你想要的结果啦。
内容的提问来源于stack exchange,提问作者Vrokipal
相关产品推荐
相关产品推荐

