基本上,我有一个数据框。由此,我采用了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的列表输出列表。但是我正在寻找的是一个新的数据框。
答案 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
函数。但是,我不明白您为什么必须使用它。此外,您可以轻松扩展此解决方案,使其接收多个输入。