Преобразование элементов в столбце с именем столбца в качестве аргумента

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

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

column <- "var2"
df <- ddply(df, .(), transform, column = func(column))

На выходе будет тот же кадр данных, но в столбце «B» за каждой буквой будет добавлена ​​буква «A».

Что бы изменить каждый элемент столбца var2 на элемент через func (здесь func используется для обрезки chr определенным образом). Я пробовал несколько решений, например:

df[do.call(func, df[,column]), ]

который не принимает df[,column] в качестве аргумента (не список) или

param = c("var1", "var2")
for(p in param){
    df <- df[func(df[,p]),]
}

который уничтожает другие данные, или

df[, column] <- lapply(df[, column], func)

Это не работает, потому что в качестве аргумента используется весь столбец, а не изменение каждого элемента 1 на 1. У меня нет идей о том, как сделать эту обработку более автоматической.

Пример :

df <- data.frame(A=1:10, B=letters[2:11])
colname <- "B"
addA <- function(text) { paste0(text, "A") }

И я хотел бы сделать что-то вроде этого:

df <- ddply(df, .(), transform, colname = addA(colname))

Хотя, если решение не использует ddply, это не проблема, просто я больше всего к этому привык.


person G.P.    schedule 05.07.2017    source источник
comment
Дает ли df[,column] <- do.call(func, list(df[,column])) нужный вам результат?   -  person Matt Jewett    schedule 05.07.2017
comment
Проблема в этом случае заключается в том, что все элементы столбца оказываются одинаковыми, а не каждый элемент из «своей» строки.   -  person G.P.    schedule 05.07.2017
comment
Можете ли вы добавить минимальный пример к вашему вопросу? Это будет включать функцию, которую вы хотите использовать, набор данных (или использовать встроенный набор данных) и желаемый результат.   -  person aosmith    schedule 05.07.2017
comment
@aosmith: добавил пример, надеюсь, он достаточно ясен   -  person G.P.    schedule 05.07.2017


Ответы (1)


Для этого вы можете использовать mutate_at из пакета dplyr.

library(dplyr)

mutate_at(df, colname, addA)

    A  B
1   1 bA
2   2 cA
3   3 dA
4   4 eA
5   5 fA
6   6 gA
7   7 hA
8   8 iA
9   9 jA
10 10 kA
person aosmith    schedule 05.07.2017