按变量名引用列

Refer a column by variable name

示例数据

dat <- 
      data.frame(Sim.Y1 = rnorm(10), Sim.Y2 = rnorm(10),
                 Sim.Y3 = rnorm(10), obsY = rnorm(10),
                 ID = sample(1:10, 10), ID_s = rep(1:2, each = 5))

对于以下向量,我想计算 ID_s

的平均值
simVec <- c('Sim.Y1.cor','Sim.Y2.cor')

for(s in simVec){

 simRef <- simVec[s]
 simID <- unlist(strsplit(simRef, split = '.cor',fixed = T))[1]   

 # this works  
 dat %>% dplyr::group_by(ID_s) %>%
 dplyr::summarise(meanMod = mean(Sim.Y1))

# this doesn't work
 dat %>% dplyr::group_by(ID_s) %>%
 dplyr::summarise(meanMod = mean(!!(simID)))
 }

如何在 dplyr 中引用列而不是通过其显式名称?

首先,如果你想用 s 索引你的向量,你必须使用 seq_along()。 其次,你缺少 sym().

这应该有效:

simVec <- c('Sim.Y1.cor','Sim.Y3.cor')

for(s in seq_along(simVec)){

  simRef <- simVec[s]
  simID <- unlist(strsplit(simRef, split = '.cor',fixed = T))[1]   

  # this works  
  dat %>% dplyr::group_by(ID_s) %>%
    dplyr::summarise(meanMod = mean(Sim.Y1))

  # this doesn't work
  dat %>% dplyr::group_by(ID_s) %>%
    dplyr::summarise(meanMod = mean(!!sym(simID)))
}

编辑:无错字

试试这个


library(dplyr)

dat %>% group_by(ID) %>% 
  summarise(mean_y1 =mean(Sim.Y1), 
            mean_y2 =mean(Sim.Y2), 
            mean_y3 =mean(Sim.Y3), 
            mean_obsY = mean(obsY))

我理解问题是,如何在不引用列名的情况下获取列,即改用索引。

如果我的理解不正确,请告诉我。

如果没有,我相信最简单的方法是按照下面的方法。

> df1 <- data.frame(ID_s=c('a','b','c'),Val=c('a1','b1','c1'))
> df1
  ID_s Val
1    a  a1
2    b  b1
3    c  c1
> df1[,1]
[1] a b c
Levels: a b c

如果要将其保存为数据框,可以按以下方式扩展:

cc <- data.frame(ID_s=df1[,1])

希望对您有所帮助!

请注意,您可以使用 summarize_at() 直接执行您的特定任务,而无需任何非标准评估:

simIDs <- stringr::str_split(simVec, ".cor") %>% purrr::map_chr(1)
# [1] "Sim.Y1" "Sim.Y2"

dat %>% dplyr::group_by(ID_s) %>% dplyr::summarise_at(simIDs, mean)
# # A tibble: 2 x 3
#    ID_s Sim.Y1  Sim.Y2
#   <int>  <dbl>   <dbl>
# 1     1  0.494 -0.0522
# 2     2 -0.104 -0.370 

也可以通过命名列表提供自定义后缀:

dat %>% dplyr::group_by(ID_s) %>% dplyr::summarise_at(simIDs, list(m=mean))
# # A tibble: 2 x 3
#    ID_s Sim.Y1_m Sim.Y2_m     <--- Note the _m suffix
#   <int>    <dbl>    <dbl>
# 1     1    0.494  -0.0522
# 2     2   -0.104  -0.370