在R语言中如何基于纬度跨35度阈值创建northsouth列
问题描述
现有如下R语言数据集:
df_input <- data.frame (ID = c(12, 12, 12, 12, 13, 13), lat = c(32, 34, 40, 39, 32, 30))
需按ID分组,判断每个分组内的纬度(lat)是否同时存在高于35和低于35的记录,最终生成包含portID(对应原ID)和northsouth(满足条件为"yes",否则为"no")的汇总数据集,目标结果如下:
df_result <- data.frame (portID = c(12, 13), northsouth = c("yes", "no"))
解决方案
方法一:使用dplyr包(tidyverse风格)
适合习惯管道语法的用户,逻辑清晰直观:
library(dplyr) df_result <- df_input %>% group_by(ID) %>% summarise( northsouth = ifelse(any(lat > 35) & any(lat < 35), "yes", "no"), .groups = "drop" ) %>% rename(portID = ID)
核心说明:
group_by(ID)按ID分组处理any(lat > 35)和any(lat < 35)分别检查分组内是否存在符合条件的记录,两者同时满足则标记为"yes".groups = "drop"取消分组状态,避免后续操作受分组影响rename将原列名ID改为目标列名portID
方法二:使用Base R(无需额外包)
如果不想加载第三方包,可直接用Base R原生函数实现:
# 先按ID分组判断条件 lat_check <- aggregate(lat ~ ID, data = df_input, FUN = function(x) { any(x > 35) & any(x < 35) }) # 转换为目标格式 df_result <- data.frame( portID = lat_check$ID, northsouth = ifelse(lat_check$lat, "yes", "no") )
核心说明:
aggregate按ID分组,对每组的lat值应用自定义函数,返回逻辑值(是否同时满足高低35的条件)- 最后将逻辑值转换为"yes"/"no"字符串,并调整列名匹配目标格式
内容的提问来源于stack exchange,提问作者E Norton
相关产品推荐
相关产品推荐

