dplyr::mutate 更改行号,如何保留它们?

dplyr::mutate changes row numbers, how to keep them?

我在 tibble 上使用 lme4::lmList 来获取适合我数据中每个主题 (id) 的线性拟合线的系数。我真正想要的是一个很好的长管道链,因为我不想保留任何输出,只需将它用于 slope/intercept 绘图。但是,我 运行 遇到了问题。 lmList 正在创建一个数据框,其中行号是原始主题 ID 号。我想保留这些信息,但是一旦我在输出上使用 mutate,行号就会从 1 变为连续的。我尝试先使用 rowid_to_column 来拯救它们,但这只是给了我一列序号也从1开始。除了从管道中取出并将它们放在基数为 R 的列中之外,我还能做什么? unique(a_df$id) 真的是最好的解决方案吗?我环顾四周,但没有看到这样的问题。

library(tibble)
library(dplyr)
library(Matrix)
library(lme4)
a_df <- tibble(id = c(rep(4, 3), rep(11, 3), rep(12, 3), rep(42, 3)),
          age = c(rep(seq(1, 3), 4)),
          hair = 1 + (age*2) + rnorm(12) + as.vector(sapply(rnorm(4), function(x) rep(x, 3))))

# as.data.frame to get around stupid RStudio diagnostics bug
int_slope <- coef(lmList(hair ~ age | id, as.data.frame(a_df))) %>%
  setNames(., c("Intercept", "Slope"))
# Notice how the row numbers are the original subject ids?
print(int_slope)

    Intercept    Slope
4   2.9723596 1.387635
11  0.2824736 2.443538
12 -1.8912636 2.494236
42  0.8648395 1.680082

int_slope2 <- int_slope %>% mutate(ybar = Intercept + (mean(a_df$age) * Slope))
# Look!  Mutate has changed them to be the numbers 1 to 4
print(int_slope2)

   Intercept    Slope     ybar
1  2.9723596 1.387635 5.747630
2  0.2824736 2.443538 5.169550
3 -1.8912636 2.494236 3.097207
4  0.8648395 1.680082 4.225004

# Try to rescue them with rowid_to_column
int_slope3 <- int_slope %>% rowid_to_column(var = "id")
# Nope, 1 to 4 again
print(int_slope3)

  id  Intercept    Slope
1  1  2.9723596 1.387635
2  2  0.2824736 2.443538
3  3 -1.8912636 2.494236
4  4  0.8648395 1.680082

谢谢,

SJ

dplyr/tidyverse 宇宙 doesn't "believe in" row names。任何对观察很重要的数据都应该包含在一列中。 tibble 包包含一个将行名称移动到列中的函数。尝试

int_slope %>% rownames_to_column()

在任何变异之前。

为什么您不在 int_slope 上创建另一个 'ybar' 列?

int_slope$ybar<- Intercept + mean(a_df$age) * Slope

没有什么比寻求帮助更能让您看到答案了。这些不是行号,它们是数字行名称。当然是! Non-contiguous 行号没有意义。 rownames_to_column 是我的答案。