处理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
相关产品推荐
相关产品推荐

