Использование ifelse с условными операторами на основе векторных индексов для зацикливания строк - PullRequest
1 голос
/ 23 октября 2019

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

Это тот фрейм данных, с которым я первоначально работал, ind1 и ind2 использовались для создания новых индексов, которые у меня есть как отдельные векторы.

COL1 <- c(1,1,1,NA,1,1)
COL2 <- c(1,NA,NA,1,1,1)
COL3 <- c(1,1,1,1,1,1)
ind1 <- c(1,2,1,2,1,2)
ind2 <- c(3,3,2,3,3,3)
Data <- data.frame (COL1, COL2, COL3, ind1, ind2)
Data
COL1 COL2 COL3 ind1 ind2
1    1    1    1    3    
1    NA   1    2    3
1    NA   1    1    2   
NA   1    1    2    3
1    1    1    1    3
1    1    1    2    3

новые индексы векторов выглядят следующим образом и в настоящее время не находятся во фрейме данных

actual <- c(5,3,4,1,1,2)
prediction <- c(1,1,2,5,5,1)

По сути, я бы хотел, чтобы функция оценивала фактический> прогноз длякаждая строка, и если это true , то она запускает функцию ниже в этой строке

replace(Data, cbind(rep(1:NROW(Data), Data$ind1), sequence(Data$ind1)), 0)

и, если фактический> прогноз равен false затем он запускает функцию ниже в этой строке

replace(Data, cbind(rep(1:NROW(Data), Data$ind2), sequence(Data$ind2)), 0)

для этого примера фрейма данных. Я ожидаю, что на выходе будет новый фрейм данных, где

Data2
COL1 COL2 COl3 ind1 ind2
1    1    1    1    3
1    1    1    2    3
1    1    1    1    2
0    0    0    2    3
0    0    0    1    3
0    0    1    2    3

То, что я до сих пор пробовал, это ...

Data2<- c()
for (i in 1:NROW (Data)) {if (actual < prediction) {
  Data2[i]<- replace(Data, cbind(rep(1:NROW(Data), Data$ind1), sequence(Data$ind1)), 0)
 } else {
  Data2[i]<- replace(Data, cbind(rep(1:NROW(Data), Data$ind2), sequence(Data$ind2)), 0)
 }  
}

Это дает мне список выходных списков для Data2. Но то, что я ищу, - это новый фрейм данных.

1 Ответ

0 голосов
/ 28 октября 2019

После того, как мы вернулись назад, я думаю, что это ответ, который даст вам желаемый результат.

COL1 <- c(1,1,1,NA,1,1)
COL2 <- c(1,NA,NA,1,1,1)
COL3 <- c(1,1,1,1,1,1)
ind1 <- c(1,2,1,2,1,2)
ind2 <- c(3,3,2,3,3,3)
Data <- data.frame (COL1, COL2, COL3, ind1, ind2)
actual <- c(5,3,4,1,1,2)
prediction <- c(1,1,2,5,5,1)

logic <- ifelse(actual > prediction, TRUE, FALSE)

Выход логического вектора:

> logic
[1]  TRUE  TRUE  TRUE FALSE FALSE  TRUE

data2<-Data
for (i in 1:NROW(Data)) {
  if (logic[i]) {
    data2[i,1:Data$ind2[i]] <- 1
  } else {
    data2[i,1:Data$ind1[i]] <- 0
  }
}

Выход цикласледующее.

> data2
  COL1 COL2 COL3 ind1 ind2
1    1    1    1    1    3
2    1    1    1    2    3
3    1    1    1    1    2
4    0    0    0    2    3
5    0    0    0    1    3
6    1    1    1    2    3

Это не тождественный вам вывод, потому что логический вывод верен в шестом месте.

Надеюсь, это поможет.

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