2015-03-02 67 views
0

感謝您在這裏的時間。基於矢量值分配數據幀,其餘未觸動

我在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不變。

ý將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

'X < - N * df1'無效行。另外,你的期望輸出將如何? – 2015-03-02 15:13:04

+0

更正了一些事情,增加了初始化和預期的結果。謝謝大衛 – notuo 2015-03-02 15:42:19

回答

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循環到相同lenth爲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 

,當然,你可以通過cond值環路中的Fortran

y <- rep(3,7) 
for(i in seq_along(cond)){ 
    if(cond[i]) 
    y[i] <- x[i] * df1$n[i] 
} 
+0

非常感謝。很容易。 – notuo 2015-03-03 00:58:26