优化 r 中的嵌套 for 循环
Optimize nested for loop in r
我有以下 r 代码。它嵌套了 for 循环。如果 i+3 行值为零,我想用 NA 替换数字。它适用于小型数据集,但是,对于大型数据集,它会挂起。我假设嵌套的 for 循环不是实现它的有效方法。有人可以帮助建议增强代码,最好是 tidyverse 库吗?
x <- data.frame(c1=c(1,2,3,2,1,3),
c2=c(4,5,6,2,3,4),
c3=c(7,8,9,7,1,6),
c4=c(4,0,9,1,5,0),
c5=c(3,8,0,7,3,6),
c6=c(2,8,5,0,5,7),
row.names = c("r1","r2","r3","r4","r5","r6"))
for( i in 1:nrow(x)){
for(j in 1:3){
if (x[i, j+3] == 0){
x[i, j] <- NA
}
}
}
输出:x
c1 c2 c3 c4 c5 c6
r1 1 4 7 4 3 2
r2 NA 5 8 0 8 8
r3 3 NA 9 9 0 5
r4 2 2 NA 1 7 0
r5 1 3 1 5 3 5
r6 NA 4 6 0 6 7
行循环不是必需的,您可以使用 ifelse
:
向量化外循环
x[1:3] <- lapply(1:3, function(n) ifelse(x[[n+3]] == 0, NA, x[[n]]))
x
# c1 c2 c3 c4 c5 c6
#r1 1 4 7 4 3 2
#r2 NA 5 8 0 8 8
#r3 3 NA 9 9 0 5
#r4 2 2 NA 1 7 0
#r5 1 3 1 5 3 5
#r6 NA 4 6 0 6 7
或者更简单的方法,您可以通过布尔索引和赋值,根据最后三列修改前三列:
x[1:3][x[4:6] == 0] <- NA
x
# c1 c2 c3 c4 c5 c6
#r1 1 4 7 4 3 2
#r2 NA 5 8 0 8 8
#r3 3 NA 9 9 0 5
#r4 2 2 NA 1 7 0
#r5 1 3 1 5 3 5
#r6 NA 4 6 0 6 7
我有以下 r 代码。它嵌套了 for 循环。如果 i+3 行值为零,我想用 NA 替换数字。它适用于小型数据集,但是,对于大型数据集,它会挂起。我假设嵌套的 for 循环不是实现它的有效方法。有人可以帮助建议增强代码,最好是 tidyverse 库吗?
x <- data.frame(c1=c(1,2,3,2,1,3),
c2=c(4,5,6,2,3,4),
c3=c(7,8,9,7,1,6),
c4=c(4,0,9,1,5,0),
c5=c(3,8,0,7,3,6),
c6=c(2,8,5,0,5,7),
row.names = c("r1","r2","r3","r4","r5","r6"))
for( i in 1:nrow(x)){
for(j in 1:3){
if (x[i, j+3] == 0){
x[i, j] <- NA
}
}
}
输出:x
c1 c2 c3 c4 c5 c6
r1 1 4 7 4 3 2
r2 NA 5 8 0 8 8
r3 3 NA 9 9 0 5
r4 2 2 NA 1 7 0
r5 1 3 1 5 3 5
r6 NA 4 6 0 6 7
行循环不是必需的,您可以使用 ifelse
:
x[1:3] <- lapply(1:3, function(n) ifelse(x[[n+3]] == 0, NA, x[[n]]))
x
# c1 c2 c3 c4 c5 c6
#r1 1 4 7 4 3 2
#r2 NA 5 8 0 8 8
#r3 3 NA 9 9 0 5
#r4 2 2 NA 1 7 0
#r5 1 3 1 5 3 5
#r6 NA 4 6 0 6 7
或者更简单的方法,您可以通过布尔索引和赋值,根据最后三列修改前三列:
x[1:3][x[4:6] == 0] <- NA
x
# c1 c2 c3 c4 c5 c6
#r1 1 4 7 4 3 2
#r2 NA 5 8 0 8 8
#r3 3 NA 9 9 0 5
#r4 2 2 NA 1 7 0
#r5 1 3 1 5 3 5
#r6 NA 4 6 0 6 7