根据矢量值添加到 data.frame,其余部分保持不变

Assing to data.frame bases on a vector value leaving the rest untouched

感谢您的光临。

我在 FORTRAN 中有这段旧代码,我被要求转换为 R。涉及一堆行,所有行都在一个 while 循环中,在那里我需要对基于的数据结构执行一些计算条件向量,其余数组保持不变。数据在这个例子中并不重要,但在下面的代码中,我需要的是仅对与 cond 向量对应的元素执行 y 和 z 赋值,如果它们为真,否则,该索引的值保持不变

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 做事的方式。

任何人都可以指出我可以用来执行此操作的任何文档或结构吗?

我有点迷路了。

再次感谢您的宝贵时间

如果通过逻辑向量 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

注意事项:如果ycond的长度不同,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]
}