Ссылка на столбец по имени переменной - PullRequest
0 голосов
/ 23 октября 2019

Пример данных

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 ]

2 голосов
/ 23 октября 2019

Обратите внимание, что ваша конкретная задача может быть выполнена без какой-либо нестандартной оценки с помощью 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 голос
/ 23 октября 2019

Во-первых, вы должны использовать 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)))
}

edit: no Typo

0 голосов
/ 23 октября 2019

Я понимаю, что вопрос в том, как получить столбец без ссылки на имя столбца, то есть вместо этого использовать индекс.

Дайте мне знать, если мое понимание неверно.

Если нет, я считаю, что самый простой способ был бы, как указано ниже.

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

Надеюсь, это поможет!

0 голосов
/ 23 октября 2019

Попробуйте это


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