R: применить функции, содержащие Excel-подобные относительные ссылки на другие столбцы - PullRequest
3 голосов
/ 21 мая 2019

dplyr имеет функции lag и lead для доступа к предыдущим и последующим строкам в таблицах.Я ищу похожую функциональность для столбцов .

Например, вот таблица:

library(tidyverse)
df <- data.frame('score1' = 1:5, 'score2' = 10:6, dif21 = NA_integer_, 
                 'score3' = 11:15, 'score4' = 20:16, dif43 = NA_integer_)
#      score1 score2 dif21 score3 score4 dif43
# 1      1     10    NA     11     20    NA
# 2      2      9    NA     12     19    NA
# 3      3      8    NA     13     18    NA
# 4      4      7    NA     14     17    NA
# 5      5      6    NA     15     16    NA

В таблице есть шаблон столбцовэто повторяется дважды: два столбца результатов, за которыми следует пустой столбец "dif", в котором будут храниться вычисленные значения.

Я могу оперировать столбцами "dif", используя mutate_at:

df_calc <- df %>% 
  mutate_at(
  vars(dif21), 
  ~ score2 - score1
  ) %>% 
  mutate_at(
    vars(dif43), 
    ~ score4 - score3
  )
#     score1 score2 dif21 score3 score4 dif43
# 1      1     10     9     11     20     9
# 2      2      9     7     12     19     7
# 3      3      8     5     13     18     5
# 4      4      7     3     14     17     3
# 5      5      6     1     15     16     1

Это дает мне расчетные баллы, которые я хочу в столбцах "dif".В общем, формула состоит в том, чтобы вычесть две позиции столбца слева от «dif» из одной позиции столбца слева от «dif».Такого рода относительные ссылки на столбцы легко обрабатываются в Excel, но я не знаю, как это сделать в R.

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

Заранее спасибо за любую помощь!

Ответы [ 2 ]

3 голосов
/ 21 мая 2019

Вот вариант baseR

idx <- which(startsWith(names(df), "dif"))
df[idx] <- df[idx - 1] - df[idx - 2]

Результат

df
#  score1 score2 dif21 score3 score4 dif43
#1      1     10     9     11     20     9
#2      2      9     7     12     19     7
#3      3      8     5     13     18     5
#4      4      7     3     14     17     3
#5      5      6     1     15     16     1

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

Затем мы просто вычитаем две позиции столбца слева от каждого столбца "dif" из одной позиции столбца слева от каждого столбца "dif".

1 голос
/ 21 мая 2019

Также в базе R мы можем сделать

df[c(F,F,T)] = df[c(F,T,F)] - df[c(T,F,F)]

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

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