在dplyr管道的mutate中实现lookup匹配报错求助
问题原因与解决方法
为什么管道里的代码会报错?
单独执行counts_table[counts_table$item == "string", "count"]时,你是用单个字符串和counts_table$item做比较,得到的是长度等于counts_table行数的逻辑向量,最终能取出对应item的单个count值。
但在mutate里,item是df的整列向量(长度等于df的行数,比如错误里的287),此时counts_table$item == item是把两个向量做循环广播式的逐元素比较,得到的逻辑向量长度是两个向量长度的公倍数(错误里的3768),用这个长度的向量去子集counts_table,返回的结果长度和df不匹配,自然就报错了。
正确的实现方式
方法1:先关联再计算(最直观)
用left_join把counts_table里的count值匹配到df中,再做除法:
df %>% left_join(counts_table, by = "item") %>% mutate(amount = amount / count) %>% select(-count) # 如果不需要保留count列,可以删掉这一行
方法2:用match做元素匹配
直接通过match找到df每个item在counts_table中的位置,取出对应count值:
df %>% mutate(amount = amount / counts_table$count[match(item, counts_table$item)])
match(item, counts_table$item)会返回一个和df行数一致的向量,每个元素是当前item在counts_table$item中的索引,这样就能精准取出对应count值做除法。
内容的提问来源于stack exchange,提问作者Xavier Villà Aguilar
相关产品推荐
相关产品推荐

