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

R语言报错:level sets of factors are different 问题求助

问题:因子水平不一致导致逻辑比较报错

问题场景

处理2020年NBA投篮数据做逻辑回归练习时,尝试通过以下代码新增一列判断投篮是否来自主场球队:

df$home.advntg <- df$Team == df$Home

持续报错:

Error in Ops.factor(df$Team, df$Home) : level sets of factors are different

数据背景

原数据集为1997-2020年NBA投篮位置数据,筛选2020年数据的代码如下:

df0 <- read_csv("NBA Shot Locations 1997 - 2020.csv")
df0$Year <- substr(df0$"Game Date",1,4)
df <- filter(df0, Year == 2020)
df <- df[,-23]

用str()检查列信息:

  • str(df$Team)返回:Factor w/ 30 levels "ATL","BKN","BOS",..: 7 16 27 3 24 1 10 8 12 12 ...
  • str(df$Home)返回:Factor w/ 30 levels "ATL","BKN","BOS",..: 7 20 27 5 28 1 10 8 1 12 ...

原数据集的Team和Home列均为36个因子水平,执行比较无报错。

关键概念解释:str()返回的数字含义

str()输出中,因子后面的数字是R对因子的内部编码:每个球队名称对应一个唯一数字(比如"ATL"对应1,"BKN"对应2,依此类推),后面的数字序列是该列每行数据对应的球队编码。

解决方案

方法1:转为字符型后比较(最直接)

跳过因子水平限制,直接比较字符串内容:

df$home.advntg <- as.character(df$Team) == as.character(df$Home)

方法2:统一因子水平集(保留因子类型)

提取两个列的所有唯一水平,重新设置因子水平后再比较:

# 获取所有唯一球队水平
all_teams <- union(levels(df$Team), levels(df$Home))
# 重新设置因子水平
df$Team <- factor(df$Team, levels = all_teams)
df$Home <- factor(df$Home, levels = all_teams)
# 执行比较
df$home.advntg <- df$Team == df$Home

方法3:读取数据时禁用自动转因子

如果后续分析不需要因子类型,读取数据时直接将Team和Home设为字符型:

df0 <- read_csv("NBA Shot Locations 1997 - 2020.csv", col_types = cols(Team = col_character(), Home = col_character()))

后续筛选后可直接执行比较操作。

内容的提问来源于stack exchange,提问作者Rachel B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:05:30