Перебирая столбец в R - PullRequest
       20

Перебирая столбец в R

6 голосов
/ 25 октября 2009

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

У меня две проблемы:

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

Ответы [ 3 ]

11 голосов
/ 26 октября 2009

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

#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 $ x), он знает, что нужно квадратировать каждое значение отдельно. Вам не нужно явно циклически обрабатывать эти значения большую часть времени - хотя, как отмечает Дирк, вам следует беспокоиться об оптимизации ваших циклов только в том случае, если они вызывают у вас проблемы. Тем не менее, я, конечно, предпочитаю читать и писать

dat$y <- dat$x^2

до:

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

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

1 голос
/ 04 ноября 2009

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

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

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

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

1 голос
/ 26 октября 2009

если parse.smiles () - это функция, которую вы хотите применить ко всем элементам вектора "vec", тогда вы можете использовать:

lapply(1:length(vec),parse.smiles(vec[i]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...