Вложенная функция ifelse R передана в sapply () для создания нового data.frame - PullRequest
2 голосов
/ 18 декабря 2010

Предположим, мы создаем data.frame следующим образом:

> hugs_per_day <- rnorm(10)
> hugs_per_day <- as.data.frame(hugs_per_day)
> hugs_per_day
   hugs_per_day
1  -2.500457495
2  -0.204545274
3  -0.955424927
4   0.320184701
5   1.822908001
6  -0.058679520
7  -0.276004919
8   0.175341993
9  -0.137404974
10  0.005096691

И мы хотим запускать функцию каждый день, чтобы возвращать значение на основе результатов, что-то вроде этого:

nested_ifelse <- function(x){

ifelse (x > 1,     mood <- "happy",
    ifelse(x < 0,  mood <- "sad", 
                   mood <- "same as yesterday" ))

   return(mood)
}

Пример nested_ifelse () делает то, что я хочу, и я уверен, что sapply () является правильной функцией R для заполнения нового столбца результатами из функции, но я просто не могу соединить их вместе.

Ответы [ 3 ]

2 голосов
/ 18 декабря 2010

nested_ifelse должно быть таким:

nested_ifelse <- function(x){
  mood <- ifelse (x > 1,   "happy",
    ifelse(x < 0, "sad", 
    "same as yesterday" ))
  return(mood)
}

или, проще,

nested_ifelse <- function(x)
  ifelse (x > 1,   "happy",
  ifelse(x < 0, "sad", 
  "same as yesterday" ))

, и вы можете использовать это так:

d$mood2 <- sapply(d$v, nested_ifelse)

но на самом деле выздесь не нужно звонить Саппли:

d$mood <- nested_ifelse(d$v)

достаточно.

данные d должны быть такими ...

d <- data.frame(v=rnorm(10))
2 голосов
/ 18 декабря 2010

Вы не использовали set.seed, поэтому пример не воспроизводим, но это должно дать вам запрошенный вектор:

    hugs_per_day$mood <- c("sad","same as yesterday","happy" )[
              findInterval(  hugs_per_day$hugs_per_day, c(-Inf, 0, 1) ) ]
    hugs_per_day
       hugs_per_day              mood
    1     0.5747557 same as yesterday
    2    -1.0236557               sad
    3    -0.0151383               sad
    4    -0.9359486               sad
    5     1.1022975             happy
    6    -0.4755931               sad
    7    -0.7094400               sad
    8    -0.5012581               sad
    9    -1.6290935               sad
    10   -1.1676193               sad
0 голосов
/ 18 декабря 2010

Я не уверен, сработает ли это для вашей реальной проблемы, но я подумал, что могу указать, что вам не всегда нужно вкладывать ifelse функции.Иногда вы можете использовать их последовательно, просто убедитесь, что вы правильно выполнили порядок, чтобы не перезаписывать предыдущие значения.

set.seed(229)
hugs_per_day <- data.frame(hugs=rnorm(10))

hugs_per_day$mood <- "same as yesterday"
hugs_per_day$mood <- with(hugs_per_day, ifelse(hugs > 1, "happy", mood))
hugs_per_day$mood <- with(hugs_per_day, ifelse(hugs < 0, "sad", mood))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...