在基于矢量索引的条件语句中使用ifelse来循环行

时间:2019-10-22 21:55:24

标签: r

基本上,我有一个数据框。由此,我采用了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的列表输出列表。但是我正在寻找的是一个新的数据框。

2 个答案:

答案 0 :(得分:0)

经过多次反复,我相信这是为您提供所需输出的答案。

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

它与您的输出不同,因为逻辑输出在第六位置为真。

我希望这会有所帮助。

答案 1 :(得分:0)

我将通过以下方式解决问题。但是,我没有完全了解您的替换逻辑。因此,我将其省略。

以下将条件和替换逻辑分为一个函数。因此,只需使用apply再次调用它,就可以轻松地将其用于其他数据帧。

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)

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

Data <- data.frame (
  col1 = COL1, col2 = COL2, col3 = COL3, ind1 = ind1, ind2 = ind2,
  actual = actual, prediction = prediction)

custom.replace <- function(row) {
  # watch out! row is an atomic vector.
  if (row["actual"] > row["prediction"]) {
    # one of your replacement logic goes here.
  } else {
    # the other goes here.
  }
}

row.axis <- 1
apply(Data, row.axis, custom.replace)

我希望这会有所帮助!

PS:我知道您想使用ìfelse函数。但是,我不明白您为什么必须使用它。此外,您可以轻松扩展此解决方案,使其接收多个输入。