Функция разницы между переменными для каждого идентификатора, затем итерация - PullRequest
0 голосов
/ 23 апреля 2020

Я хотел бы сделать эту функцию и присвоить новому столбцу то же имя, что и столбец, прежде чем вычислять разницу между каждым периодом для каждого идентификатора. Поэтому я но colnames (df) [i], но это не работает? Затем я хочу запустить эту функцию для нескольких столбцов.

id <- rep(1:3,each=2)
period <- rep(1:2,3)
q1 <- c(3,2,4,1,8,5)
q2 <- c(4,1,2,1,9,6)
q3 <- c(6,4,6,1,4,2)

df <- data.frame(id, period,q1,q2,q3)
df

id period q1 q2 q3
------------------
1      1  3  4  6
1      2  2  1  4
2      1  4  2  6
2      2  1  1  1
3      1  8  9  4
3      2  5  6  2

test <- function(i){
  d <- df %>% 
    group_by(id) %>%
    summarise(colnames(df)[i] = abs(diff(i)))
  return(d)

}

test(3)

num <-list()
quest <- c(4:6)
(for i in 1:length(quest)){
  i <- quest[n]
  num[[n]] <- test(i)
}

В конце она должна выглядеть следующим образом:

     id q1 q2 q3
     -----------
     1  1  3  2
     2  3  1  5
     3  3  3  2

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Вы можете использовать summarise_at, который может применять функцию к нескольким столбцам одновременно.

library(dplyr)

df %>%
  group_by(id) %>%
  summarise_at(vars(starts_with('q')), ~sum(abs(diff(.))))

# A tibble: 3 x 4
#     id    q1    q2    q3
#  <int> <dbl> <dbl> <dbl>
#1     1     1     3     2
#2     2     3     1     5
#3     3     3     3     2
0 голосов
/ 24 апреля 2020

Вот вариант с data.table

library(data.table)
nm1 <- grep('^q\\d+$', names(df), value = TRUE)
setDT(df)[, lapply(.SD, function(x) sum(abs(diff(x)))), id, .SDcols = nm1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...