Функция R Apply() для определенных столбцов данных - программирование
Подтвердить что ты не робот

Функция R Apply() для определенных столбцов данных

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

B<- by(wifi,(wifi$Room),FUN=function(y){apply(y, 2, A)})

Это применит A ко всем столбцам y

B<- by(wifi,(wifi$Room),FUN=function(y){apply(y[4:9], 2, A)})

Это относится только к столбцам 4-9 из y, но общий возврат B-полосок от первых 3 столбцов... Я все еще хочу их, я просто не хочу, чтобы A применялся к ним.

wifi[,1:3]+B 

также не делает того, что я ожидал/хотел.

4b9b3361

Ответ 1

Использование примерной функции data.frame и example (всего +1 для всех значений)

A <- function(x) x + 1
wifi <- data.frame(replicate(9,1:4))
wifi

#  X1 X2 X3 X4 X5 X6 X7 X8 X9
#1  1  1  1  1  1  1  1  1  1
#2  2  2  2  2  2  2  2  2  2
#3  3  3  3  3  3  3  3  3  3
#4  4  4  4  4  4  4  4  4  4

data.frame(wifi[1:3], apply(wifi[4:9],2, A) )
#or
cbind(wifi[1:3], apply(wifi[4:9],2, A) )

#  X1 X2 X3 X4 X5 X6 X7 X8 X9
#1  1  1  1  2  2  2  2  2  2
#2  2  2  2  3  3  3  3  3  3
#3  3  3  3  4  4  4  4  4  4
#4  4  4  4  5  5  5  5  5  5

Или даже:

data.frame(wifi[1:3], lapply(wifi[4:9], A) )
#or
cbind(wifi[1:3], lapply(wifi[4:9], A) )

#  X1 X2 X3 X4 X5 X6 X7 X8 X9
#1  1  1  1  2  2  2  2  2  2
#2  2  2  2  3  3  3  3  3  3
#3  3  3  3  4  4  4  4  4  4
#4  4  4  4  5  5  5  5  5  5

Ответ 2

lapply, вероятно, лучший выбор, чем apply здесь, так как применяют первые коллажи вашего файла data.frame к массиву, что означает, что все столбцы должны иметь один и тот же тип. В зависимости от вашего контекста это может иметь непреднамеренные последствия.

Образец:

df[cols] <- lapply(df[cols], FUN)

Вектор "cols" может быть переменными именами или индексами. Я предпочитаю использовать имена, когда это возможно (он устойчив к переупорядочению столбцов). Поэтому в вашем случае это может быть:

wifi[4:9] <- lapply(wifi[4:9], A)

Пример использования имен столбцов:

wifi <- data.frame(A=1:4, B=runif(4), C=5:9)
wifi[c("B", "C")] <- lapply(wifi[c("B", "C")], function(x) -1 * x)