R语言迁移数据插补代码复现中.[cc,cc]语法解析及下标越界问题排查
关于R语言中
.[]下标语法与迁移数据插补表格维度问题的解答 问题1:.cc,cc]命令的作用是什么?
你之前对这个语法的理解有误——它不是访问右下角单元格,而是R管道(%>%)操作里的子集提取语法:
- 在管道中,
.代表上一步输出的对象,这里就是xtabs()生成的交叉表(本质是带行名/列名的矩阵类对象)。 .[cc,cc]的意思是:从这个交叉表中,提取行名属于cc向量且列名也属于cc向量的子矩阵。简单说就是把表格“过滤”成仅包含目标国家的方阵,只保留行和列都在cc指定国家列表里的部分。
举个小例子:如果cc是c("AFG", "ALB"),这个语法就会取出表格中行名为AFG、ALB,列名也为AFG、ALB的2×2子矩阵。
问题2:下标越界错误的原因及解决方案
错误原因
你已经猜对了核心问题:cc里有94个国家,但经过filter(pob %in% cc, por %in% cc)后,生成的交叉表中,行名(对应pob)或列名(对应por)缺少了cc里的某一个国家。比如某个国家在pob里没有匹配的记录,那么交叉表的行名就不会包含它,这时候用.[cc,cc]去索引这个不存在的行/列,就会触发“下标越界”。
解决方案
要生成包含cc所有国家的完整方阵(即使部分国家没有迁移存量数据,也要保留位置填0),可以通过强制设置因子水平来实现,修改后的代码如下:
s1 <- d0 %>% filter(year == d5$year0[1], sex == d5$sex[1], age == d5$age[1], pob %in% cc, por %in% cc) %>% # 强制把pob和por的因子水平设置为cc的所有国家,确保缺失的国家也会在表格中占位 mutate( pob = factor(pob, levels = cc), por = factor(por, levels = cc) ) %>% xtabs(formula = stock ~ pob + por)
这样生成的xtabs结果会是一个94×94的完整矩阵,每个cc里的国家都会出现在行和列中,没有数据的单元格会自动填充0,也就不需要再用.[cc,cc]做额外子集了——直接得到你需要的维度一致的矩阵。
如果还是需要用子集语法确认,现在直接用.[cc,cc]也不会报错,因为行和列的名称完全匹配cc。
内容的提问来源于stack exchange,提问作者Peter Kamal
相关产品推荐
相关产品推荐

