R dplyr преобразовать данные столбца с вычислением, которое включает индекс столбца - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь преобразовать данные в столбцы информационного кадра с помощью вычисления, которое включает в себя индекс преобразованного столбца. У меня есть функциональный код, который выполняет это с помощью цикла по столбцам, однако, если это возможно, я бы хотел выполнить это как шаг dplyr, так как есть несколько других преобразований, примененных к этим данным.

ВотПример кода поведения:

df <- data.frame(column1 = c(1,2,3),column2 = c(1,2,3), column3=c(1,2,3))

for(name in names(df)){
  index <- which(names(df)==name)
  df[name] <- lapply(df[name],function(x) (x+(0.005*index)))
}

df

Вывод:

  column1 column2 column3
1   1.005    1.01   1.015
2   2.005    2.01   2.015
3   3.005    3.01   3.015

Когда я пытаюсь преобразовать это в шаг dplyr, то получаю доступ к индексу столбца как части преобразования. См. Следующий код (где df - это тот же самый фрейм данных, что и выше, а column_index - заполнитель для некоторой логики):

df %>%
  mutate_at(vars(starts_with("column")),funs(.+(0.005*column_index)))

Пожалуйста, посоветуйте правильный способ сделать это как часть шага dplyr или, если этоневозможно, лучший способ решить эту проблему, чем цикл.

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Вы запрашиваете возможность tidyverse, однако, этот тип задач может быть выполнен более элегантно / эффективно с помощью base R:

sweep(df, 2, FUN = function(x, y) x + (0.005 * y), seq_along(df))

  column1 column2 column3
1   1.005    1.01   1.015
2   2.005    2.01   2.015
3   3.005    3.01   3.015

И, конечно, вы можете использовать конвейердля возможных дальнейших шагов:

sweep(df, 2, FUN = function(x, y) x +(0.005 * y), seq_along(df)) %>%
 mutate_all(~ . * 10)
1 голос
/ 25 октября 2019

Я думаю, что циклический подход является самым чистым. Я бы упростил ваш цикл следующим образом:

for(col in seq_along(df)){
  df[, col] <- df[, col] + (0.005 * col)
}

Нет lapply необходимо, потому что + векторизован. И поскольку вас интересует индекс столбца, а не имя столбца, имеет смысл циклический переход по индексу столбца.


Не думаю, что вы сможете найти более приятный способ сделать это с dplyr / tidyr. Подход "аккуратный" преобразовал бы ваши данные в длинный формат, создал столбец former_column_index, и тогда вычисление было бы операцией над двумя столбцами, mutate(value = value + 0.005 * former_column_index). Вы можете, конечно, затем преобразовать данные обратно в широкоформатный формат. Это будет гораздо менее эффективно, чем описанный выше циклический подход.

Я оставлю это любому, кто захочет продемонстрировать решение в том же духе.

Без дополнительных подробностей о вашем "нескольких другихтрансформации ", трудно судить, поможет ли это с ними.

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