R语言中如何实现跨行列值匹配并生成对应新变量
解决方案:逐行匹配生成新变量
这问题我明白啦,你需要的是逐行检查val2的每个值是否在val1里出现过,然后给符合条件的行对应的val4赋值val3的值对吧?之前用any()没成功是因为any()会返回一个全局的逻辑结果(判断整个val2向量里是否有元素在val1中),没办法实现逐行的条件判断。下面给你两种可行的方案:
方法一:Base R 原生实现
不需要额外安装包,直接用%in%生成逐行的逻辑判断,配合ifelse完成赋值:
# 你的原始数据框 x <- data.frame( val1 = c(10,10,10,1,12,15), val2 = c(5,4,3,2,1,6), val3 = c(100,200,200,100,400,411) ) # 添加val4变量 x$val4 <- ifelse(x$val2 %in% x$val1, x$val3, NA)
执行后输出的结果和你的预期完全一致:
> x val1 val2 val3 val4 1 10 5 100 NA 2 10 4 200 NA 3 10 3 200 NA 4 1 2 100 NA 5 12 1 400 400 6 15 6 411 NA
方法二:tidyverse/dplyr 实现
如果你习惯用tidyverse风格的代码,可以用dplyr的mutate和if_else函数,逻辑更清晰:
library(dplyr) x <- x %>% mutate(val4 = if_else(val2 %in% val1, val3, NA_real_))
关键逻辑说明
val2 %in% val1会生成一个与数据框行数一致的逻辑向量,每个元素对应当前行的val2值是否在整个val1向量中存在ifelse/if_else会根据这个逻辑向量,给符合条件的行赋值val3,不符合的赋值NA
内容的提问来源于stack exchange,提问作者Jorge Hernández
相关产品推荐
相关产品推荐

