R применить функцию() к определенным столбцам фрейма данных



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



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


это относится ко всем столбцам y



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


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



wifi[,1:3]+B 


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

655   4  

4 ответов:

используя пример данных.фрейм и пример функции (всего +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

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

модель:

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)

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

как уже упоминалось, вы просто хотите стандартный R apply функция, применяемая к столбцам (MARGIN=2):

wifi[,4:9] <- apply(wifi[,4:9], MARGIN=2, FUN=A)

или, для краткости:

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

это обновление столбцов 4: 9 на месте с помощью

Comments

    Ничего не найдено.