2014-12-18 6 views
1

Я применяя эту функцию в список в R.R - передать имя столбца в качестве переменной lapply

tmp<-lapply(mydata,transform, V3 = ifelse(V2 > 20, V3, NA)) 

Каждый элемент в списке является dataframe с 3 числовых столбцов V1, V2 и V3. Приведенный выше код работает отлично.

Но если я пытаюсь установить столбцы в качестве переменных:

colA<-paste("V",2,sep="") 
colB<-paste("V",3,sep="") 

, а затем:

tmp<-lapply(mydata,transform, colB = ifelse(colA > 20, colB, NA)) 

это не работает. Он создает новый столбец с именем «colB» fill с строкой «V3».

Я также попытался с ПОЛУЧАЕТЕ:

tmp<-lapply(mydata,transform, get(colB) = ifelse(get(colA) > 20, get(colB), NA)) 
Error: unexpected '=' in "tmp<-lapply(mydata,transform, get(colB) =" 

Есть ли способ передать переменную с именем столбца в R? Конечная цель состоит в том, что colA и colB передаются в качестве аргументов командной строки при вызове сценария с Rscript, поскольку тот же код может применяться к различным спискам с переменным числом столбцов. Благодаря

+0

Мне действительно нужно хранить все как список ... – PedroA

ответ

2

Это похоже на обсуждение subset (Why is `[` better than `subset`?) в том смысле, что transform используется интерактивно. Потому что ваше использование является более программным здесь (вы передаете имена переменных через объекты), то лучше отойти от transform и начать использовать [[ доступ (получить/установить) столбцы ваших данных:

lapply(mydata, function(x) { 
    x[[colB]] <- ifelse(x[[colA]] > 20, x[[colB]], NA) 
    return(x) 
}) 

Или

lapply(mydata, function(x, c1, c2) { 
    x[[c2]] <- ifelse(x[[c1]] > 20, x[[c2]], NA) 
    return(x) 
}, c1 = colA, c2 = colB) 
+1

Вот что говорит 'help (" transform ")'. – Roland

+0

для меня, он говорит 'подстрочный код за границей' –

+0

Отлично, это сработало для меня отлично. – PedroA

Смежные вопросы