Как определить и запустить функцию над фреймом данных? - PullRequest
0 голосов
/ 02 февраля 2019

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

Функция просто: function(x) ifelse(x>0, paste0("+", x), x)

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

И я бы хотел запустить модифицированную функцию над кадром данных df,Есть ли способ сделать это встроенным?

Пример данных для игры:

structure(list(data_2018 = c(3.2, 3, 3.2), data_2017 = c(2.825, 
0, -0.425), pilot = c(0.51578947368421, -0.0526315789473699, 
0.41052631578947), all = c(0.42222222222222, -0.18518518518519, 
0.27407407407407), general = c(0.40833333333333, -0.0833333333333299, 
0.36666666666667)), class = "data.frame", row.names = c(NA, -3L
))

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Существует несколько подходов, которые вы можете использовать:


base

daf[, 2:5] <- lapply(daf[, 2:5], fu)

dplyr

#library(dplyr)

mutate_at(daf, vars(data_2017:general), fu)

data.table

#library(data.table)

dat <- data.table(daf)

dat[, 
    (colnames(dat)[-1]) := lapply(.SD, fu), 
    .SDcols = -1
    ]

данные

daf <- structure(
  list(data_2018 = c(3.2, 3, 3.2), 
       data_2017 = c(2.825, 0, -0.425), 
       pilot = c(0.51578947368421, -0.0526315789473699, 0.41052631578947), 
       all = c(0.42222222222222, -0.18518518518519, 0.27407407407407), 
       general = c(0.40833333333333, -0.0833333333333299, 0.36666666666667)
  ), 
  class = "data.frame", row.names = c(NA, -3L)
)

функция

fu <- function(x) ifelse(x>0, paste0("+", x), x)

выход

  data_2018 data_2017               pilot               all             general
1       3.2    +2.825   +0.51578947368421 +0.42222222222222   +0.40833333333333
2       3.0         0 -0.0526315789473699 -0.18518518518519 -0.0833333333333299
3       3.2    -0.425   +0.41052631578947 +0.27407407407407   +0.36666666666667

Вывод отображается только для lapply вызова


0 голосов
/ 02 февраля 2019
Кажется,

теряет завершающий ноль в первом столбце, но это работает, когда вы рассматриваете данные в качестве примера df:

df2 <- as.data.frame(apply(df, 2, function(x) if_else(substr(as.character(x), 1, 1) == "-" | as.character(x) == "0",
                                                  as.character(x),
                                                  paste0("+", as.character(x)))))

Я выбрал другой подход - я искал знак минуса илиноль в качестве символов, а затем добавил + оттуда.

ОБНОВЛЕНИЕ - упрощенный код ниже с dplyr

library(dplyr)
df2 <- df %>%
  mutate_all(as.character) %>% 
  apply(2, function(x) if_else(substr(x, 1, 1) == "-" | x == "0",
                           x,
                           paste0("+", x))) %>% 
  as.data.frame()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...