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

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

Пример данных: df <- data.frame("Var1" = c(0:5), "Var2" = c(-5:0), "Var3" = c(0,0,0,0,0,0)

> df
  Var1 Var2 Var3
1    0   -5    0
2    1   -4    0
3    2   -3    0
4    3   -2    0
5    4   -1    0
6    5    0    0

Пример функции:

myFun <- function(x, na_value){
  x[x == na_value] <- NA
  x
}

Учитывая, что я хочу преобразовать 0 в NA для Var1 и Var 2 - но НЕVar3, я написал df$Var1 <- myFun(df$Var1, 0) и df$Var2 <- myFun(df$Var2, 0) - но должен быть более простой способ сделать это?

Что я вижу, это что-то вроде myFun(Var1, Var2, 0), которое преобразует 0 в Var1 и Var2 в NA без необходимости повторять код для обеих переменных.Эта функция должна применяться для нескольких фреймов данных с разными именами переменных и разными значениями na_values, поэтому я написал ее в первую очередь, и она отлично работает, но я хотел бы упростить еще больше.

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Для одного отдельного кадра данных, apply является стандартным способом сделать это.Например, здесь:

df[ , -3] <- apply(df[ , -3], FUN = myFun, na_value = 0, MARGIN = 2)
df

Однако я не знаю, отформатированы ли другие ваши кадры данных точно так же.Но вы можете объединить apply и lapply (или mapply) для выполнения этой операции на всех ваших фреймах данных.

EDIT : Вот более общее (инемного некрасивое или старомодное) решение с петлей for:

## Define a list of two dataframes:
df <- data.frame("Var1" = c(0:5), "Var2" = c(-5:0), "Var3" = c(0,0,0,0,0,0))
df2 <- data.frame("VarA" = c(0:5), "VarB" = c(-5:0), "VarC" = c(3,3,3,3,3,3))
my_list <- list(df, df2)
## Colnames to consider, and missing values indicator, for each dataframe:
na_values <- list(0, 3) # NA = 0 in the first one, NA = 3 in the second
cols <- list(c("Var1", "Var2"), c("VarA", "VarB"))
## Define an R function to replace a given character by "NA" in a dataframe:
replace_nas <- function(data, cols, na_value){
    data[ , cols] <- lapply(data[ , cols], FUN = function(x) {
        x[x == na_value] <- NA
        return(x)
    }
    )
    return(data)
}
## Do this operation for each dataframe in "my_list" with a for loop:
res_list <- list()
for (k in 1:length(my_list)) {
    res_list[[k]] <- replace_nas(my_list[[k]], cols[[k]], na_values[[k]])
}
res_list

Возможно, не оптимально, но оно работает!

0 голосов
/ 10 июля 2019

Поскольку вы запрашиваете более простое решение, вы можете просто определить ячейки, равные нулю, исключая таким образом столбец 3, и установить для них значение NA следующим образом:

df[-3][df[-3] == 0] <- NA
#   Var1 Var2 Var3
# 1   NA   -5    0
# 2    1   -4    0
# 3    2   -3    0
# 4    3   -2    0
# 5    4   -1    0
# 6    5   NA    0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...