2016-08-05 50 views
0

我對R很新,有一些工作經驗,但不是很流利。 我最近在一個大數據集上使用了一個數據集,並使用R 3.3.1來處理這個數據集。 在數據框(X)中,有一列標誌類型和2列數字類型,即高度和重量。多個然後條件在一個單一的IF循環在R

的值是這樣的:

h  w  hw_flag 
5.874 60.5478 0 
4.874 40.5478 0 
3.874 10.5478 1 
2.999 6.5478  1 
8.874 90.5478 0 
5.111 50.5478 1 
6.554 65.5478 0 

我已經初始化了兩個新的列H_1和W_1爲0

X$h_1 <- 0 
X$w_1 <- 0 

現在,我想的是,只要hw_flag爲1,那麼h_1和w_1應分別獲得從h和w複製的條目,然後,一旦將值複製到h_1和w_1,相應的h和w值就會變爲0.我希望在一個循環中完成所有操作。

現在,我必須寫4路這4個steps.The代碼,我的工作是如下,它給我所需要的輸出我想有:

for(i in 1:nrow(X)){ 
    if(X$hw_flag[i] == '1') 
    X$h_1[i] <- X$h[i]; 
} 

for(i in 1:nrow(X)){ 
    if(X$hw_flag[i] == '1') 
    X$w_1[i] <- X$w[i]; 
} 

for(i in 1:nrow(X)){ 
    if(X$hw_flag[i] == '1') 
    X$h[i] <- 0; 
} 

for(i in 1:nrow(X)){ 
    if(X$hw_flag[i] == '1') 
    X$w[i] <- 0; 
} 

Output : 

h  w   hw_flag h_1 w_1 
5.874 60.5478   0  0 0 
4.874 40.5478   0  0 0 
0  0    1  3.874 10.5478 
0  0    1  2.999 6.5478  
8.874 90.5478   0  0  0 
0   0    1  5.111 50.5478 
6.554 65.5478   0  0  0 

我試圖把所有在一個循環,但肯定是我面臨的問題是,第一步得到按預期執行,而第二步不能正常工作。我試着放下;並通過回車換行,但仍然沒有成功。 我嘗試的代碼是以下並將其複製的H值H_1但在接下來的步驟中,它並沒有照搬值w與W_1:

for(i in 1:nrow(X)) { 
    if(X$hw_flag[i] == '1') 
    X$h_1[i] <- X$h[i]; 
    X$w_1[i] <- X$w[i]; 
    X$h[i] <- 0; 
    X$w[i] <- 0; 
    } 

所以,我基本上想知道我怎麼能爲相同的IF-是塊放置多個然後語句。

+0

嘗試周圍的命令由'if'語句在大括號中運行,以同樣的方式爲你爲'for'循環完成了。 – rosscova

+1

你不需要在R. –

+0

中使用';'謝謝@rosscova,我不知何故錯過了這些大括號。 – PD1

回答

3

無需循環。只需找到hw_flag等於1的位置,然後複製數據,然後用零覆蓋hw。要運行

xy <- read.table(text = "h  w  hw_flag 
5.874 60.5478 0 
       4.874 40.5478 0 
       3.874 10.5478 1 
       2.999 6.5478  1 
       8.874 90.5478 0 
       5.111 50.5478 1 
       6.554 65.5478 0", header = TRUE) 

xy$h_1 <- 0 
xy$w_1 <- 0 

hwflag1 <- xy$hw_flag == 1 
xy[hwflag1, c("h_1", "w_1")] <- xy[hwflag1, c("h", "w")] 
xy[hwflag1, c("h", "w")] <- 0 

     h  w hw_flag h_1  w_1 
1 5.874 60.5478  0 0.000 0.0000 
2 4.874 40.5478  0 0.000 0.0000 
3 0.000 0.0000  1 3.874 10.5478 
4 0.000 0.0000  1 2.999 6.5478 
5 8.874 90.5478  0 0.000 0.0000 
6 0.000 0.0000  1 5.111 50.5478 
7 6.554 65.5478  0 0.000 0.0000 
+0

我會說,「不需要在行**上循環**」。多次循環向量可以超越矢量化操作,因爲避免了矩陣轉換和方法調度...只是說:) –

+0

感謝羅馬和@DavidArenburg。此代碼運行良好,複雜性低於運行循環。 – PD1

+0

@DavidArenburg:你能否對你說的部分有更多的瞭解。可能是相同的鏈接可以幫助更好地理解它。我正在尋找更多的細節版本,說明你對超越操作和方法調度的看法。 – PD1

0

的命令確實應該包含大括號內:

for(i in 1:nrow(X)) { 
    if(X$hw_flag[i] == '1') { 
     X$h_1[i] <- X$h[i] 
     X$w_1[i] <- X$w[i] 
     X$h[i] <- 0 
     X$w[i] <- 0 
    } 
} 
相關問題