Для каждого столбца в фрейме данных R - PullRequest
0 голосов
/ 12 ноября 2018

Мне было интересно, как работают циклы в R кадрах данных. Это не воспроизводимый пример, но мне интересно, может ли концепция работать. Если df имеет переменные Date, ID, Amount и 4, могу ли я перебрать столбцы? Мне нужно удалить строки NA из столбцов Var1-Var4, создать «вектор веса» на основе столбца Amount, а затем вычислить взвешенное среднее.

a<- names(df)
a<- a[4:7]

a
[1] "Var1" "Var2" "Var3" "Var4"


#df has Date, ID, Amount ,Var1, Var2, Var3, Var4

for(i in a) {

  NEW <-df[ !is.na(df$i), ]
  NEW <- NEW %>%
    group_by(Date) %>%
    mutate(Weights = Amount/sum(Amount))

  SUM <-  NEW %>%
    group_by(Date) %>%
    summarise(Value = weighted.mean(i, Weights))

  write.csv(SUM , paste0(i, ".csv"))

}

1 Ответ

0 голосов
/ 12 ноября 2018

Вы можете циклически проходить по столбцу, хотя вы должны внести небольшие изменения в свой синтаксис. Если вы хотите проиндексировать ваш фрейм данных с именем столбца, хранящимся в переменной (в вашем цикле имена хранятся в переменной цикла i), вы можете получить доступ к столбцу следующими способами:

1.) С помощью синтаксиса подмножества base-R вы должны использовать [,i] для подстановки нужного столбца:

df[,i]

ПРИМЕЧАНИЕ: df$i здесь не будет работать.

2.) В dplyr функциях вы должны преобразовать свою символьную переменную i в имя вашего фрейма данных в смысле dplyr. Это можно сделать с помощью функции as.name. Затем вы должны оценить имя, чтобы функции dplyr могли с ним работать. Это делается с помощью функции !! ("bang-bang"):

df %>% select(!!as.name(i))

или в вашем случае:

SUM <-  NEW %>%
   group_by(Date) %>%
   summarise(Value = weighted.mean(!!as.name(i), Weights))

В противном случае ваш синтаксис выглядит нормально, просто просматривайте набор имен и индексируйте кадр данных, как я описал. Надеюсь, это ответит на ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...