R语言data.table中setnames函数报错:object 'variable'未找到求助
问题:替换data.table列值时出现"object 'variable' not found"错误
场景与数据结构
有两个data.table类型的数据集:
dt包含group、variable、value三列,variable列存储编码值:
head(dt) group variable value Other x_3_od B Shops x_2_od A Supplies x_3_od D Other x_1_zr C Other x_2_od C Shops x_1_zr D
variables包含name和labels列,name与dt$variable存在交集,labels是对应编码的解释性名称。
尝试代码与报错
想要将dt$variable的编码替换为variables$labels中匹配的值,先后尝试以下代码均报错:
第一次尝试:
setnames(dt, old = variable, new = variables$labels[match(variable, variables$name)])
报错信息:
Error in match(variable, variables$name) : object 'variable' not found
第二次尝试:
setnames(dt, old = variable, new = variables$labels[match(dt$variable, variables$name)])
报错信息:
Error in anyDuplicated(old) : object 'variable' not found
补充数据集dput
dt <- structure(list(group = structure(c(12L, 3L, 3L, 12L, 12L, 12L ), levels = c("Automobiles", "Supplies", "Shops", "Markets", "Food", "Services", "Leisure", "Pets", "Materials", "Media", "Other", "Technology", "A", "Bars", "c", "d", "Closed", "f"), class = "factor"), variable = c("x_3_od", "x_2_od", "x_3_od ", "x_1_zr", "x_2_od", "x_1_zr"), value = c("B", "A", "D", "C", "C", "D")), row.names = c(NA, -6L), class = c("data.table", "data.frame" )) variables <- structure(list(name = c("x_n_1", "x_n_2", "x_1_zr", "x_2_zr", "x_1_bz", "x_2_bz", "x_3_od", "x_2_od", "x_1_vb", "x_2_vb", "x_3_bz", "x_m_2", "x_d_4s", "x_1_od", "x_m_3"), labels = c("Houses", "Flats", "New Ratio", "Ratio", "Quality", "Class", "Balance", "Cost", "Sales 1", "Sales 2", "Terms", "Position", "Duration Average", "History", "Others")), row.names = c(NA, -15L), class = c("data.table", "data.frame"), index = structure(integer(0), "`__module`" = c(13L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 14L, 15L)))
错误原因与解决方案
错误原因
你误用了setnames()函数:这个函数的作用是修改列名,而非替换列中的具体值。你传入的old = variable会被R当作独立全局对象查找,但variable只是dt中的一列,并非全局对象,因此触发“找不到对象”的错误。
另外从补充数据能看到一个隐藏问题:dt$variable里有个值带末尾空格("x_3_od "),这会导致和variables$name的"x_3_od"匹配失败,需要先清理空格。
正确解决方法
要替换列中的值,使用data.table的赋值语法,推荐两种方式:
方式1:使用match赋值
# 先清理variable列的空格 dt[, variable := trimws(variable)] # 匹配替换编码为对应labels dt[, variable := variables$labels[match(variable, variables$name)]]
方式2:使用data.table连接(更高效,适合大数据集)
# 清理空格 dt[, variable := trimws(variable)] # 左连接后替换值 dt[variables, on = .(variable = name), variable := i.labels]
内容的提问来源于stack exchange,提问作者Bambeil
相关产品推荐
相关产品推荐

