根据矢量值添加到 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
注意事项:如果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]
}
感谢您的光临。
我在 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
注意事项:如果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]
}