2010-07-29 2 views
0

В цикле я пытаюсь получить вектор-столбец фактора класса в числовой.Ссылка на вектор-столбец в кадре данных в цикле

Если бы не петля, код будет выглядеть

c1$values <- as.numeric(as.character(c1$values)) 

Но как я могу ссылаться на $ значения c1 с петлей? Я попробовал два подхода:

get(paste('c',i,"$values", sep="")) 

просто не работает даже за пределами цикла, в то время как

get(paste('c',"1", sep=""))[[1]] 

работает в себе (возвращает вектор-столбец), но при попытке выполнить операцию:

assign(get(paste("c","1", sep=""))[[1]], as.numeric(as.character(get(paste("c","1", sep=""))[[1]]))) 

возвращает ошибку «неверный первый аргумент».

Любые идеи?

Спасибо,

Роберто

+0

Могу ли я увидеть цикл? Мне это трудно понять без него. :/ –

ответ

1

Внутренне оператор $ это функция, которая может быть явно называется "$" для получения и "$<-" для установки. assign - противоположность get. Так ломать вещи на дискретные шаги, которые мы имеем:

varname<-paste("c",1,sep="") 
obj<-get(varname) 
x<-"$"(obj,"values") 
x<-as.numeric(as.character(x)) 
obj<-"$<-"(obj,"values",x) 
assign(varname,obj) 

Но имея данные (например, индекс) закодированы в имени переменной не является хорошей практикой. Лучше было бы превратить c1, c2 и т. Д. В список или кадр данных, а затем перебрать их. Преобразование может быть выполнено следующим образом:

lapply(1:2,function(i) get(paste('c',i,sep=''))) 
+0

jmoy, спасибо. Я вижу вариант hardcoding, но я не понимаю последнее предложение о lapply. c1, c2 и т. д. - это кадры данных. Можете ли вы расширить эту мысль? Попытка изучить хорошие практики. – Roberto

+0

c1, c2, ... образуют последовательность, и get (paste (...)) является нашим способом получения определенных элементов последовательности. Но списки уже предоставлены R для представления последовательностей со стандартной операцией подписи и для циклов для получения элементов. Я предполагал, что вы используете переменные c1, c2, ... в правильный список фреймов данных, а не сохраняете их как неявную последовательность, связанную по имени. Примером примера было показать, как это можно сделать. –

1

Вы также можете индексировать столбцы целыми числами. Это объясняется в справочном руководстве R на веб-сайте R.

+0

не сделал это в последнем примере? Тем не менее это не работает. – Roberto

+1

Нет, вы этого не сделали. Здесь: 'z <- data.frame (x = c (1,2,3), y = c (4,5,6))", а затем 'z [, 2]' совпадает с z $ y – zvrba

+0

Ах, я просто посмотрел на ваш вопрос, не глядя на ваш код.Лучше всего поместить все ваши кадры данных в список, например 'all <- list (c1 = data.frame (..), c2 = data.frame (..))' Теперь вы можете получите доступ к вашим фреймам как 'все $ c1' или как' все [[1]] 'или просто' c1', если вы сначала используете 'attach (everything)'. Опять же, все это объясняется в свободно доступной литературе по R. – zvrba

0

Вместо того, чтобы преобразовывать переменные факторов в числовые, вам, вероятно, лучше всего понять, почему они были превращены в факторы в первую очередь.

Однако, так как никто не дал вам достойное решение вашей проблемы, вот простой подход с sapply и lapply:

factors <- sapply(c1, is.factor) 
c1[factors] <- lapply(c1[factors], function(x) as.numeric(as.character(x))) 
Смежные вопросы