通过变量名称引用列

时间:2019-10-23 11:05:11

标签: r dplyr tidyeval nse

样本数据

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中引用列而不用其显式名称?

4 个答案:

答案 0 :(得分:2)

请注意,使用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 

答案 1 :(得分:1)

首先,如果要使用seq_along()进行矢量索引,则必须使用s。 其次,您缺少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)))
}

编辑:无错字

答案 2 :(得分:0)

尝试


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))

答案 3 :(得分:0)

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

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

否则,我认为最简单的方法如下。

> 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])

希望这会有所帮助!