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
также не делать то, что я ожидал/хотел.
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