2009-10-25 2 views
5

Я использую R's stats пакет и хотел бы Переберите column[x] в all the rows of a dataframe, работают на данных в each cell в колонке с функцией и передать результат в новый столбец (с calculated result в new column выровнены с данными в column[x])Looping через колонку в R

у меня есть две проблемы:

  1. Я не могу заставить его работать
  2. зацикливание, кажется, не рекомендуется в R articles Я читал. Есть ли альтернативный подход, а если нет, есть ли у кого-нибудь пример того, как выполнять цикл?
+0

Можете ли вы дать нам более подробную информацию? Как пример проблемы, с которой вы работаете? – ariddell

+2

Цикл не обязательно обескуражен. Сначала запустите его, и только потом подумайте о получении, если быстрее. –

ответ

8

Без каких-либо примеров трудно понять, как реагировать. Основной случай, что вы описываете, однако, заключается в следующем:

#Just a very simple data frame 
dat <- data.frame(x = c(1, 2, 3)) 
#Compute the squared value of each value in x 
dat$y <- dat$x^2 
#See the resultant data.frame, now with column y 
dat 

Когда вы говорите R в квадрат вектора (или вектор-подобную структуру, как Дат $ х), он знает квадрат каждое значение отдельно , Вам не нужно явно цитировать эти значения большую часть времени, хотя, как отмечает Дирк, вам нужно только беспокоиться об оптимизации ваших циклов, если они вызывают проблемы. То есть, я, конечно, предпочитаю читать и писать

dat$y <- dat$x^2 

к:

for(i in 1:length(dat$x)){ 
    dat$y[i] <- dat$x[i]^2 
} 

... где это возможно.

+0

Спасибо. Я могу получить арифметику, работающую ОК. Я не могу передать содержимое фрейма данных функции. Вот проблема. Вот в верхней части кадра (называемые данными) с заголовками «соединение» и «Улыбки» (улыбки текстовое представление молекулы) Compound_ID SMILES 12345 c1cccccc1 Я хочу использовать функцию parse.smiles() в читать в смайлах и выводить молекулу. Если я сделаю это на одной молекуле, то OK (хлам <- "c1ccccc1", проанализируйте.улыбки (барахло) Если я зр <- get.smiles.parser() барахло <- sapply (данные $ улыбок, parse.smiles, парсер = зр) он не может интерпретировать улыбки – Andy

+0

Хорошо. Извините, не был уверен, где вы были в R, поэтому я подумал, что просто брошу основной случай. «unknown» может иметь это, но если нет, лучше всего разместить небольшой набор данных и функцию. Сложно понять, что не так из описания, и я, по крайней мере, не могу получить никаких * применять функции без экспериментов. –

1

если parse.smiles() является функцией, которую вы хотите применить ко всей записи вектора «VEC», то вы можете использовать:

lapply(1:length(vec),parse.smiles(vec[i])) 
+2

Спасибо всем. Колонка, в которой меня интересовало, была прочитана как фактор. Я должен был явно указать функции на чтение в качестве символов, и я не понял этого до тех пор, пока не будет указано. Сейчас он работает. (и извинения за искаженный комментарий выше - он был отформатирован с возвратами, которые исчезли при публикации) – Andy

1

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

Чтобы сделать это в способе мышления R, выделите свою функцию, если она еще не векторизована (см. Функцию Vectorize), затем вызовите эту функцию со всем столбцом в качестве аргумента и назначьте ее новому столбцу.

f<-Vectorize(function(x,...),'x') 
data$newcolumn<-f(data[,1]) 

Применить семейство (применяются, sapply, lapply, mapply, tapply) также являются альтернативами. Большинство нативных R-функций уже векторизованы, но будьте осторожны при передаче дополнительных аргументов, которые предполагается интерпретировать как векторы.

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