R для цикла со списком символов - PullRequest
0 голосов
/ 14 марта 2019

У меня есть df, например:

name <- rep(c("a","b","c"),5)
QV.low <- runif(15, 2, 5)
QV.med <- runif(15, 5.0, 7.5)
QV.high <- runif(15, 7.5, 10)
df <-  as.data.frame(cbind(name, QV.low, QV.med,QV.high))

и список имен:

name.list <- c("a","b")

Я хочу выполнить операцию, например:

df %>% 
    subset(name %in% name.list) %>%
    summarise(.,sum = sum(QV.low))

но я хочу для каждой переменной QV. через цикл.

Я пытался:

QV.list <- c("QV.low", "QV.med", "QV.high")
for(qv in 1:length(QV.list)){
    QV <- noquote(QV.list[qv])
    print(QV)
    df %>% 
        subset(name %in% name.list) %>%
        summarise(.,sum = sum(QV))
}

Но это не работает.

Как я могу "извлечь" значение символа из QV.list, чтобы позже использовать его в качестве переменной df?

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

Вам нужно иметь как минимум 3 разных имени в namecol, иначе namecol %in% name.list1 бесполезно.Если нет фильтра и трубы, петля не нужна.Простой colSums(df[,-1]) сделает работу.

library(tidyverse)

QV.low <- runif(10, 2, 5)
QV.med <- runif(10, 5.0, 7.5)
QV.high <- runif(10, 7.5, 10)
namecol <- sample(c("a","b", "c"), 10, replace = T)
df <-  data.frame(namecol, QV.low, QV.med,QV.high)
df
name.list1  <- c("a","b") # select some names

QV.list <- c("QV.low", "QV.med", "QV.high")

for(i in QV.list){
  QV <- noquote(i)
  print(QV)
  qv <- sym(i)
  print(df %>% 
    filter(namecol %in% name.list1) %>%
    summarise(sum = sum(!!qv)))
}

даст вам

[1] QV.low
     sum
1 29.093
[1] QV.med
       sum
1 61.07034
[1] QV.high
       sum
1 86.02611
0 голосов
/ 14 марта 2019

если я понял вашу проблему, вы можете решить это:

for( name in names(df)){
  df[,name]
  ....
  df %>% summarise(.,sum = sum(df[,name]))
}
...