Трансформирайте елементи в колона с името на колоната като аргумент

Опитвам се да модифицирам данните в набор от данни въз основа на вектор от колони за промяна. По този начин бих могъл да факторизирам лечението въз основа на конфигурационен файл, който ще има списък с колони за промяна като променлива.

В идеалния случай бих искал да мога да използвам ddply така:

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

Резултатът ще бъде същият кадър с данни, но в колоната „B“ всяка буква ще има добавено „A“ зад нея

Което ще промени всеки елемент от колоната var2 от елемента чрез func (func тук се използва за изрязване на chr по определен начин). Опитах няколко решения, като:

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

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

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