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

处理data.frame中公司代码变更时的冗余数据及报错问题求助

嘿,这两个问题我都碰到过,给你捋捋解决办法!

先搞定那个!=的报错问题

你遇到的Error in Ops.data.frame(...) : ‘!=’ only defined for equally-sized data frames,本质原因是你用longitudinal[y, 2]提取的是一个小data.frame,而不是单个向量。!=运算符没法直接在data.frame和另一个data.frame(或向量)之间这么比。

解决办法很简单,把列转换成向量就行:用$或者[[来提取列,而不是用,切片。比如你原来的代码如果是类似这样:

# 错误写法
y <- some_indices
longitudinal[y, 2] != longitudinal[y-1, 2]

改成下面这样就没问题了:

# 正确写法:提取成向量再比较
longitudinal$name[y] != longitudinal$name[y-1]
# 或者用[[索引列
longitudinal[[2]][y] != longitudinal[[2]][y-1]

如果是要批量找所有name发生变化的行,更高效的写法是:

# 找到所有name和上一行不同的行索引
name_change_rows <- which(longitudinal$name[-1] != longitudinal$name[-nrow(longitudinal)]) + 1

这里longitudinal$name[-1]去掉第一行,longitudinal$name[-nrow(longitudinal)]去掉最后一行,两个向量长度完全一致,就能正常用!=比较了,最后+1是把索引对应回原数据的行号。


再处理股票代码变更的冗余数据

假设你的数据是按时间顺序排列的(这很重要!),我们可以先找到ticker发生变化的位置,再删除对应的冗余行。这里分两种方法给你:

方法1:基础R实现

# 1. 找到ticker和上一行不同的行索引
ticker_change_rows <- which(longitudinal$ticker[-1] != longitudinal$ticker[-nrow(longitudinal)]) + 1

# 2. 标记需要保留的行(这里假设冗余是变更点的前一行,你可以根据实际需求调整)
keep <- rep(TRUE, nrow(longitudinal))
# 比如如果冗余是变更点本身,就把keep[ticker_change_rows]设为FALSE
keep[ticker_change_rows - 1] <- FALSE

# 3. 过滤得到干净的数据
cleaned_data <- longitudinal[keep, ]

方法2:用dplyr更简洁

如果你常用tidyverse的工具,这个写法更直观:

library(dplyr)

cleaned_data <- longitudinal %>%
  # 新增一列,存上一行的ticker
  mutate(prev_ticker = lag(ticker)) %>%
  # 过滤掉冗余行:这里保留所有行,除了ticker发生变更的冗余行(按需调整条件)
  filter(!(ticker != prev_ticker & !is.na(prev_ticker)))

如果你觉得变更后的第一行是冗余,就把过滤条件改成ticker == prev_ticker | is.na(prev_ticker),这样只保留连续相同ticker的行,以及第一行。


内容的提问来源于stack exchange,提问作者Daniel E Carcamo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:23:37