Требуются аналогии для аргументов "[" - PullRequest
3 голосов
/ 21 мая 2011

Я пришел к мысли, что аргументы "[" похожи на пулеметные ремни:

set.seed(10)
datfrm <- data.frame(a= rev(letters[1:10]), b = runif(10), cc = letters[1:10] )
datfrm[datfrm$b < 0.5, "b"] <- 0

поэтому ремень пулемета проходит только через первый аргумент "[":

               ---
               ---
               ---
               ---
datfrm[datfrm$b < 0.5, "b"] <- 0

Но если вы хотите назначать только подмножеству, скажем, из другого столбца:

               ---                         ---
               ---                         ---
               ---                         ---
               ---                         ---
datfrm[ datfrm$b < .5, "cc"] <- datfrm[ datfrm$b < .5, "a"]

Выражение datfrm$b многократно оценивается, и когда они соединяются в паре с любой стороны присвоения ... все происходит как ожидалось. Так что в этом плохого или правильного и можно ли его улучшить?

1 Ответ

4 голосов
/ 21 мая 2011

Вы можете сначала сохранить индекс, чтобы он рассчитывался только один раз:

idx <- datfrm$b < .5
datfrm[idx, "cc"] <- datfrm[idx, "a"]

Это проще для чтения и менее подвержено ошибкам при внесении изменений.

Я думаю, within, вероятно, обеспечивает наименьшее количество набрав, поэтому, используя idx, как указано выше, и заменяя оригинал выводом inside ():

datfrm <- within(datfrm, cc[idx] <- a[idx])
...