繁体   English   中英

合并 R 中的行索引(by = 0 和 by = "row.names" 不起作用)

[英]Merging on row index in R (by = 0 and by = "row.names" not working)

Tl;dr - 我正在尝试将 merge.data.table() function 与行索引一起使用,R 文档中给出的建议不起作用。

我的数据大致是:

library(data.table)
library(quantreg)
library(purrr)

foo <- expand.grid(c(seq(60001, 60050, by = 1),
                   c("18-30", "31-60", "61+"),
                   c("pre", "during", "after"))
foo <- as.data.table(foo)
setnames(foo, names(foo), c("zip", "agegroup", "period"))
foo <- cbind(foo, 
             quartile = floor(runif(n = nrow(foo), 1, 4)),
             times = runif(n = nrow(foo), 18, 25))

我对数据进行了几次分位数回归,按年龄组(应他人的要求)进行了子集化。

v_tau <- c(0.01, 0.025, seq(0.05, 0.95, by = 0.05), 0.975, 0.99)

mq_age1 <- map(v_tau, ~rq(data = foo[agegroup == "18-30",], 
               times ~ quartile + period + quartile*period,
               tau = .x))  

我正在尝试将来自rq() object 的预测拟合值向量与原始 data.table 合并(我也可以将其转换为 dataframe,它不一定是数据表)。 该向量比 data.table 中的行数短,因此我一直在尝试将此处给出的答案应用于plm() object,进行修改以说明我的拟合值没有多个索引属性这一事实。

所以,我一直在尝试做的是按行索引加入它们。 我意识到我可以创建另一个带有显式索引的列,但我想避免这种情况,因为拟合值来自数据的一个子集,而我将它们连接到数据的一个子集; 添加显式索引是可能的,但不是统一的或简约的,并且最终会生成很多我不想处理的 NA。

fitted <- mq_age1[[10]]$fitted.values
d_fitted <- cbind(attr(fitted, "index"),
                    fitted = fitted)

foo2 <- merge(foo[agegroup == "18-30",], d_fitted, by = 0, all.x = TRUE) 

查看merge() 文档,它说:“要合并的列可以按名称、数字或逻辑向量指定:名称“row.names”或数字 0 指定行名称。如果按名称指定它必须唯一对应于输入中的命名列。”

但是,当我尝试这样做时,它会给我以下错误消息:

Error in 
merge.data.table(foo[agegroup == "18-30", ], d_fitted, by = 0,  : 
A non-empty vector of column names for `by` is required.

同样,当我尝试使用“row.names”时:

foo2 <- merge(foo[agegroup == "18-30",], d_fitted, by = "row.names", all.x = TRUE)
Error in merge.data.table(foo[agegroup == "18-30", ], d_fitted, by = "row.names",  : 
  Elements listed in `by` must be valid column names in x and y

到底是怎么回事? 为什么我不能这样做?

找到了答案:@r2evans 友善地指出 base::merge 有这个功能,而 data.table::merge 没有。

foo <- as.data.frame(foo)

foo2 <- merge(foo[foo$agegroup == "18-49",], d_fitted, by = 0, all.x = TRUE)

成功了。 谢谢!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM