Ищу подмножество <- function - PullRequest
       4

Ищу подмножество <- function

1 голос
/ 17 октября 2011

Мне было интересно, было ли что-нибудь подобное функции subset, но для назначения, а не для извлечения. Часто мне нужно сделать что-то вроде

rows <- # some condition
df$x[rows] <- with(df[rows, ], {
    # operation 1...
})
df$y[rows] <- with(df[rows, ], {
    # operation 2...
})

И мне кажется, что было бы неплохо иметь возможность написать

subset(df, rows, c(x, y)) <- (some expression combining operations 1 and 2)

Есть что-нибудь подобное?

РЕДАКТИРОВАТЬ: немного фона. В SAS можно написать код обработки данных, например

if /* condition */ then do;
    x = ...; y = ...; z = ...;
end;
else if /* some other condition */ then do;
    x = ...; y = ...; z = ...;
end;
else if /* etcetera */

Я в основном ищу самый простой / самый элегантный способ воспроизвести это в R. Прямой перевод будет включать цикл for для всех строк во фрейме данных, и, очевидно, я бы предпочел этого не делать.

Ответы [ 2 ]

2 голосов
/ 17 октября 2011

Помните, что subset - это только сахар сверху. Поэтому, почему бы не использовать «базовое» подмножество, как предусмотрено [:

df[rows, c("x", "y")]<-with(df[rows,], {...})

Это для тебя?

0 голосов
/ 17 октября 2011

Что касается обработки SAS-ish, если порядок строк не имеет значения:

  1. Добавьте столбец к вашему data.frame, который содержит различные случаи как фактор.Например, вы можете использовать ifelse для этого, но в зависимости от условий, могут быть и более эффективные способы.Я предполагаю, что этот столбец теперь называется "proctype"
  2. Load plyr и использую ddply что-то похожее на:

    ddply(df, .(proctype), function(curdf){
        #you can use with/within here with curdf
        curproctype <- curdf$proctype[1]
        switch(curproctype, #note: may be easier to just use an if here
           nameoffirstproctypelevel = firstkindofprocessing(curdf),
           nameofsecondproctypelevel = secondkindofprocessing(curdf))
    })
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...