R: применить функцию к конкретным столбцам, сохраняя остальную часть фрейма данных

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

Используя функцию sapply, например, следующим образом:

    a<-as.data.frame(sapply(table.xy[,1], function(x){x*1000}))

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

    a<-as.data.frame(sapply(table.xy, function(x) if (colnames=="columnA") {x/1000} else {x}))

но этот не сработал.

Мое обходное решение состояло в том, чтобы предоставить обе файлам данных еще одну строку с идентификаторами, а затем объединить старый фреймворк с вновь созданным, чтобы получить полный. Но я думаю, что должно быть лучшее решение. Не так ли?

Ответ 1

Если вы хотите делать вычисления только на одном или нескольких столбцах, вы можете использовать transform или просто индексировать его вручную:

# with transfrom:
df <- data.frame(A = 1:10, B = 1:10)
df <- transform(df, A = A*1000)

# Manually:
df <- data.frame(A = 1:10, B = 1:10)
df$A <- df$A * 1000

Ответ 2

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

(df <- data.frame(x = 1, y = 1:10, z=11:20))
(df <- cbind(df[1], apply(df[2:3],2, function(x){x*1000})))

В принципе, используйте cbind() для выбора столбцов, в которых вы не хотите, чтобы функция запускалась, а затем используйте apply() с нужными функциями в целевых столбцах.

Ответ 3

В dplyr мы будем использовать mutate_at, в котором вы можете выбрать или исключить (путем добавления имени переменной со знаком "-" минус) определенные переменные. Вы можете просто назвать функцию

df <- df %>% mutate_at(vars(columnA), scale)

или создайте свой собственный

df <- df %>% mutate_at(vars(columnA, columnC), function(x) {do this})