旧版本R中sapply内\(y) lambda表达式的替代方案咨询
旧版本R中替换lambda表达式(y)的解决方案
数据集
name = c("john", "john", "john", "alex","alex", "tim", "tim", "tim", "ralph", "ralph") year = c(2010, 2011, 2012, 2011, 2012, 2010, 2011, 2012, 2014, 2016) my_data = data.frame(name, year)
需求目标
统计存在至少一个缺失(非连续)年份的分组数量,预期输出如下:
# sample output year count 1 2014, 2016 1
问题原因
你遇到的错误是因为旧版本R(4.1.0之前)不支持\(y)这种简洁lambda表达式语法,该语法是R 4.1.0才引入的新特性。
修正后的代码
将\(y)替换为传统的function(y)写法即可,完整代码如下:
agg <- aggregate(year ~ name, my_data, c) # 替换lambda表达式为function(y) agg <- agg$year[sapply(agg$year, function(y) any(diff(y) != 1))] # 统计非连续年份组合的出现次数并转为数据框 result <- as.data.frame(table(sapply(agg, paste, collapse = ", "))) # 重命名列名匹配示例输出 colnames(result) <- c("year", "count") print(result)
代码说明
- 第一步
aggregate按name分组,把每个分组的year合并为向量; - 第二步
sapply遍历每个分组的年份向量,用function(y)判断年份是否连续(diff(y) !=1表示存在间隔),筛选出非连续的年份组; - 最后将非连续的年份向量拼接为字符串,用
table统计出现次数,再转为数据框并调整列名。
运行修正后的代码即可得到符合预期的输出。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

