能否用apply系列函数替代多dataframe行操作的for循环?
用apply系列函数替代for循环实现多DataFrame行操作
当然可以用apply系列函数实现这个逻辑,这里推荐使用sapply来简化代码,替代原有的for循环:
首先保留原样本数据:
# Sample data set.seed(123) df1 <- data.frame(a = sample(1:100, size = 20), b = sample(letters, size = 20)) df2 <- data.frame(c = sample(1:100, size = 20), d = sample(letters, size = 20))
用sapply实现核心逻辑
# 替代for循环的sapply写法 df2$x <- sapply(df2$c, function(num) { match_letter <- df1$b[df1$a == num] if (length(match_letter) > 0) match_letter else "No match" })
代码说明
sapply会遍历df2$c中的每个数值,将其传入匿名函数作为参数num- 在匿名函数内,匹配
df1中a列等于num对应的b列值 - 通过判断匹配结果的长度(替代原代码的
!is_empty,无需额外依赖包),返回匹配字母或"No match" - 最终
sapply返回的结果直接赋值给df2$x,无需逐行索引操作
按行遍历的apply实现(可选)
如果需要严格按行遍历df2,也可以用apply按行处理:
# 按行遍历df2的apply写法 df2$x <- apply(df2, 1, function(row) { num <- as.integer(row["c"]) match_letter <- df1$b[df1$a == num] if (length(match_letter) > 0) match_letter else "No match" })
不过第一种直接遍历目标列的方式效率更高,无需处理整行冗余数据。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

