感谢您在这里的时间。
我在FORTRAN中有这个旧代码,我被要求转换为R.涉及一堆行,都在一个while循环中,在那里我有一些计算我需要在条件向量的数据结构上执行,保持阵列的其余部分不受影响。在这个例子中数据并不重要,但是在下面的代码中我需要的是只对与cond向量相对应的元素执行y和z赋值,如果它们为TRUE,否则,该索引的值保持不变
s <- c("a","b","c","d","e","f","g")
v <- c(12965, 150086, 994637, 304718, 22960, 2524, 20608)
df1 <- data.frame(s=s, n=c(52, 158, 56, 19, 8, 7, 0))
df2 <- data.frame(s=s, n=c(23, 542, 433, 65, 5756, 12, 1))
cond <- c(TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE)
N <- 123
x <- N * df1$n
y <- rep(3, 37)
keep.going = TRUE
while (keep.going) {
y <- x * df1$n
...
z <- v * df1$n + df2$n
if (some condition)
keep.going <- FALSE
}
我之前添加了y
预期结果是按原样计算的运算,但是y {3],y [5],z [3]和z [5]等于3未触及。
y将是332592 3070572 3 44403 3 6027 0 和z将是674203 23714130 3 5789707 3 17680 1
在FORTRAN我有这样的事情:
do i = 1, k1
if (cond(i)) then
y(i) = x(i) * df1n(i)
end if
end do
...
do i = 1, k1
if (cond(i)) then
z(i) = df1n(i) + df2n(i)
end if
end do
当然,在FORTRAN中实现它很容易,而不是R做的事情。
任何人都可以指出我可以使用的任何文档或构造吗?
我有点失落。
再次感谢您的时间
答案 0 :(得分:1)
如果按逻辑向量cond
对向量进行子集化,则返回cond==TRUE
的位置。所以你可以做部分作业,
y <- rep(3, 7)
z <- rep(3, 7)
y[cond] <- x[cond] * df1$n[cond]
z[cond] <- v[cond] * df1$n[cond] + df2$n[cond]
cbind(y, z)
# y z
#[1,] 332592 674203
#[2,] 3070572 23714130
#[3,] 3 3
#[4,] 44403 5789707
#[5,] 3 3
#[6,] 6027 17680
#[7,] 0 1
警告说明:如果y
和cond
的长度不同,则cond
将被回收为与y
相同的长度。
y <- rep(3, 14)
y[cond] <- x[cond] * df1$n[cond]
y
#[1] 332592 3070572 3 44403 3 6027 0 332592 3070572 3 44403
#[12] 3 6027 0
当然,你可以像在Fortran中一样循环cond
的值
y <- rep(3,7)
for(i in seq_along(cond)){
if(cond[i])
y[i] <- x[i] * df1$n[i]
}