Заменить значение в столбце с помощью цикла и пользовательской функции - R - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть data.frame со столбцом (с именем «color»), в котором каждое значение «черный».Я также создал функцию, которая может заменить «черный» другими цветами в зависимости от значения другого столбца (значение столбца «рост»).Мне нужно создать цикл, который использует эту функцию для замены значений в столбце «цвет» в соответствии со значением «рост»

# Create a function
check_it <- function(x) 
  if(x>500){
    return("green")
  } else if(x<0) {
      return("red")
  } else {
    return("blue")
}
# Create a loop using check_it
for(x in 1:nrow(all_data)) {
     ...
# Given this hint:
# You can use 1:nrow(all_data) as a set of indices 
# to do something like the following inside the loop:
#    all_data[i, "color"] <- 
#    check_it( all_data[i, "growth"] )

Есть предложения?

SAMPLE DATA

| station_id | timestamp | growth.x | growth.y | color |
--------------------------------------------------------
|     DB1    | 1/14/01   | 59.916   | 59.9164  | black |
--------------------------------------------------------
|     DB1    | 1/14/02   | 316.128  | 316.128  | black |
--------------------------------------------------------
|     DB1    | 1/14/03   | -12.456  | -12.456  | black |
--------------------------------------------------------
|     DB1    | 1/14/04   | 537.443  | 537.443  | black |
--------------------------------------------------------

Спасибо за помощь!Благодаря комментариям я смог понять, что моя функция не будет работать без вставленных правильных аргументов (у меня просто было «x»), и я не сказал своей функции, где искать значение «growth».

Вот код, который я использовал в итоге:

check_it <- function(x, ) 
  if(all_data[x, "growth.x"] >500){
    return("green")
  } else if(all_data[x, "growth.x"] <0) {
      return("red")
  } else {
    return("blue")
}

# Create a loop using check_it
for(x in 1:nrow(all_data)) {

   all_data[x, "color"] <- check_it(x, all_data)
}

1 Ответ

0 голосов
/ 21 февраля 2019

Ну, конечно, есть много решений вашей проблемы.Но так как вы специально запросили цикл и предоставили свою собственную функцию, я постарался придерживаться того, что вы сделали, насколько это возможно.Однако у вас есть две growth -колонки, поэтому я взял growth.y.

datf <- read.table(text="
                        station_id   timestamp   growth.x   growth.y   color  
                        DB1      1/14/01     59.916     59.9164    black  
                        DB1      1/14/02     316.128    316.128    black  
                        DB1      1/14/03      12.456     12.456    black  
                        DB1      1/14/04     537.443    537.443    black", 
                        header = TRUE, stringsAsFactors = FALSE) 

#I had to change your function a little:

check_it <- function(x, dat) 
  if(dat[x, "growth.y"] >500){
    return("green")
  } else if(dat[x, "growth.y"] < 0) {
    return("red")
  } else {
    return("blue")
  }

Теперь ваша переменная цикла x соответствует индексу строки data.frame, и вы просматриваете его.До этого это был не тот случай, когда вы просто передавали число в свою функцию.

#And finally the loop
for(x in 1:nrow(datf)){

  datf[x, "color"] <- check_it(x, datf)

}

> datf
  station_id timestamp growth.x growth.y color
1        DB1   1/14/01   59.916  59.9164  blue
2        DB1   1/14/02  316.128 316.1280  blue
3        DB1   1/14/03   12.456  12.4560  blue
4        DB1   1/14/04  537.443 537.4430 green

Однако вы должны рассмотреть вопрос о семействе * apply-function.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...