Как написать последовательный цикл for с возможностью условного поиска - PullRequest
1 голос
/ 09 апреля 2019

Начинающий здесь. Я пытаюсь написать цикл для корректировки счета. Первая часть цикла for создает условный вывод, который должен быть передан второй части цикла for с функцией поиска.

В первом data.frame, a, есть 2 столбца

  • оценка (оценка участника)
  • проблема (проблемы с оценкой участника)

Во втором блоке данных. B, 5 столбцов

  • оценка (оценка участника)
  • q (скорректированная оценка при проблеме = 1)
  • r (скорректированная оценка при проблеме = 2)
  • с (скорректированная оценка при проблеме = 0)
  • t (скорректированная оценка при проблеме> 2)

В первом цикле for я нахожу индекс где a $ оценка = b $ оценка

Затем во втором цикле я передаю индекс в другой цикл. Основываясь на значении в $ задачи, цикл возвращает правильное значение в (q, r, s, t).

Вот data.frame a

id      score   problem
1       11      1
2       12      6
3       13      2
4       14      0
5       NA      NA

Вот data.frame b

score   q   r   s   t
11      12  13  11  NA
12      14  15  12  NA
13      16  20  13  NA
14      18  22  14  NA
NA      NA  NA  NA  NA

Я бы хотел, чтобы вывод функции был новым столбцом в a, с поправкой на $

Вот функция, которую я пробовал,

adjust <- function (y, z){

# y = problem
# z = score

  for(j in z){
    index <- sapply(j, function(x) b$score %in% x)
    for (i in y){
      ifelse(i > 2, 
             z(i) <- b[index, 5],
             ifelse(i == 2, 
                    z(i) <- b[index, 3],
                    ifelse(i == 1, 
                           z(i) <- b[index, 2],
                           ifelse( i == 0, 
                           z(i) <- b[index, 4],
                           z(i) <- b[index, 5]))))
      print(z(i))
    }
  }
  }

Это все еще ново для меня. Не уверен, где я иду не так. Когда я назначаю:

a$adjusted <- adjust(a$problem, a$score)

Ничего не происходит

Любая и вся помощь очень ценится здесь.

1 Ответ

0 голосов
/ 09 апреля 2019

Чтобы упростить вложенные операторы ifelse, я использовал функцию case_when из пакета dplyr. Я также использовал функцию match для упрощения внутреннего цикла (т. Е. Sapply)

a<-read.table(header=TRUE, text="id      score   problem
1       12      1
2       11      6
3       13      2
4       14      0
5       NA      NA")

b<-read.table(header=TRUE, text="score   q   r   s   t
11      12  13  11  NA
12      14  15  12  NA
13      16  20  13  NA
14      18  22  14  NA
NA      NA  NA  NA  NA")

library(dplyr)

#find column name associated with problem score if NA use the score column
colname<-case_when(
    a$problem==0 ~ "s",
    a$problem==1 ~ "q",
    a$problem==2 ~ "r",
    a$problem >2 ~ "t",
    is.na(a$problem) ~"score"
)

# find the corresponding row in table b to match data frame a
rowscore<-match(a$score, b$score)

#column name and rowscore are the same length
#loop through the column name/row name to find the adjusted score
a$adjusted<-sapply(1:length(rowscore), function(i){b[[colname[i]]][rowscore[i]]} )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...