R data.table多条件筛选异常:多条件组合返回0观测值求解
解决data.table多条件筛选返回0观测值的问题
你遇到的问题其实是代码里的字符串常量未加引号导致的,再加上可以优化data.table的筛选语法,咱们一步步来修正:
问题根源
你的筛选代码里有两个关键错误:
FRANCE和LOW是字符串值,但你没有用引号包裹,R会把它们当作变量名来解析,而你并没有定义这两个变量,所以这些条件会被判定为NA,最终导致没有匹配的行。- 使用
data$列名的写法在data.table里不是最优的,data.table支持直接在[]中使用列名,写法更简洁高效。
修正后的代码
首先,先确保你的数据是data.table格式(如果还没转的话):
library(data.table) data <- data.table( COUNTRY = c("FRANCE", "GERMANY", "FINLAND", "JAPAN", "USA"), GENDER = c("MAN", "WOMEN", "MAN", "MAN", "WOMEN"), CURRENCY = c("EURO", "EURO", "EURO", "YEN", "DOLLAR"), INCOME_GROUP = c("HIGH", "LOW", "LOW", "HIGH", "LOW"), YEAR = c("2014", "2015", "2016", "2017", "2018") )
然后用正确的多条件筛选:
# 修正引号问题,同时使用data.table简洁语法 datanew <- data[YEAR == "2014" & CURRENCY == "DOLLAR" & COUNTRY == "FRANCE" & INCOME_GROUP == "LOW"]
不过这里要注意:你的原始数据里没有同时满足这四个条件的行(2014年的FRANCE是EURO和HIGH收入组),所以执行后还是会返回0行,但这是数据本身的问题,不是代码语法错误了。如果我们调整一个条件,比如把CURRENCY == "EURO"和INCOME_GROUP == "HIGH",就能筛选到对应行:
# 筛选存在匹配的条件组合 datanew <- data[YEAR == "2014" & CURRENCY == "EURO" & COUNTRY == "FRANCE" & INCOME_GROUP == "HIGH"] # 输出结果: # COUNTRY GENDER CURRENCY INCOME_GROUP YEAR # 1: FRANCE MAN EURO HIGH 2014
额外提示
在data.table中,还可以用更清晰的方式写多条件,比如把条件拆分成多行:
datanew <- data[ YEAR == "2014" & CURRENCY == "EURO" & COUNTRY == "FRANCE" & INCOME_GROUP == "HIGH" ]
这样可读性更强,尤其是条件较多的时候。
内容的提问来源于stack exchange,提问作者newuser456
相关产品推荐
相关产品推荐

