You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:46:04