Подтвердить что ты не робот

Применить функцию к каждому значению в фрейме данных R

У меня есть 58 столбцов dataframe, мне нужно применить преобразование $log (x_ {i, j} +1) $ко всем значениям в первых 56 столбцах. Какой метод я могу использовать, чтобы сделать это наиболее эффективно? Я предполагаю, что есть что-то, что позволило бы мне сделать это, а не просто использовать некоторые из циклов для прохождения через весь фрейм данных.

4b9b3361

Ответ 1

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

df.log[,1:56] <- log(df[,1:56]+1)

Ответ 2

Ответ alexwhan подходит для журнала (и, вероятно, должен быть выбран в качестве правильного ответа). Тем не менее, он работает так чисто, потому что журнал векторизован. Я слишком часто испытывал особую боль не-векторизованных функций. Когда я начал с R и не очень хорошо разбирался в семье, я часто обращался к уродливым петлям. Таким образом, для тех, кто может наткнуться на этот вопрос, у которых нет векторизованных функций, я предоставляю следующее доказательство концепции.

#Creating sample data
df <- as.data.frame(matrix(runif(56 * 56), 56, 56))
#Writing an ugly non-vectorized function
logplusone <- function(x) {log(x[1] + 1)}
#example code that achieves the desired result, despite the lack of a vectorized function
df[, 1:56] <- as.data.frame(lapply(df[, 1:56], FUN = function(x) {sapply(x, FUN = logplusone)}))
#Proof that the results are the same using both methods... 
#Note: I used all.equal rather than all so that the values are tested using machine tolerance for mathematical equivalence.  This is probably a non-issue for the current example, but might be relevant with some other testing functions.
#should evaluate to true
all.equal(log(df[, 1:56] + 1),as.data.frame(lapply(df[, 1:56], FUN = function(x) {sapply(x, FUN = logplusone)})))