[英]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.