根据矢量值分配给数据帧,其余部分保持不变

时间:2015-03-02 15:07:25

标签: r dataframe conditional-statements

感谢您在这里的时间。

我在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做的事情。

任何人都可以指出我可以使用的任何文档或构造吗?

我有点失落。

再次感谢您的时间

1 个答案:

答案 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

警告说明:如果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]
}