2015-05-19 76 views
0

我正面臨着R中for循環的問題。如果某個條件適用於數據元素,則需要創建一個新向量。但是,我只希望R遍歷數據集的前49列。這是迄今爲止的代碼,但R返回多個錯誤消息。使用帶if條件的for循環創建新向量

meanedu = c() 
count= 0 
sum = 0 
###HV105.01:HV105.49 are the columns for which I want the for loop to run### 
for i in ncol(HV105.01:HV105.49) i++) } 
    ###burkina cut is the name of the dataset. I want the for loop to run for all rows### 
    for (j in nrow(burkinacut) j++) { 
##defining a new variable age which is the position [1,1] in my dataset### 
     age = burkinacut[i,j] 
     if (age >= 25) { 
##if age>=25 create a new vector adult edu which is the value 49 spaces to the right from the current data element## 
      adultedu= (i, j+49) 
      sum = sum + adultedu ###sum this vector### 
      count= count++ 
     } 
    } 
} 

我將不勝感激關於如何使代碼運行的任何建議。我試圖解釋說明我希望做什麼。從我所做的研究來看,apply,lapply或mapply函數可能是最好用的,但我不明白在這種情況下如何使用它們。

+1

首先,您for'循環的語法關閉。嘗試類似'for(我在1:49){做點什麼}' – keegan

+0

R是一種解釋型語言,它可以運行一小段代碼來查看語法是否有效。例如,在這裏你可以運行'HV105.01:HV105.49',這個錯誤會告訴你這不是一個有效的方法來獲得一系列的列。您可以通過嘗試使用'HV105.01'來測試期間是否適用於訪問列,當這種情況不起作用時,您可能會記得使用'['代替。同樣,'2 ++'不起作用,所以'i ++'也不起作用。 – Gregor

回答

0

我會建議一個不同的方法來解決你的問題。

首先,讓我們來生成一個簡單的數據集:

set.seed(2015) # make sure the example is reproducible 

# create a sample data set 
d <- as.data.frame(matrix(sample(20:40,20,replace=T),nrow=4)) 
# V1 V2 V3 V4 V5 
# 1 21 22 33 20 25 
# 2 37 27 30 28 21 
# 3 26 30 34 35 37 
# 4 20 21 28 38 28 

爲了簡單起見,我會假設你有興趣在第一四列。另外,我會假設數據集沒有NA值。

可以創建滿足所需條件的元素的布爾掩碼矩陣:

bm <- (d >= 25 & col(d) <= 4) 
#   V1 V2 V3 V4 V5 
# [1,] FALSE FALSE TRUE FALSE FALSE 
# [2,] TRUE TRUE TRUE TRUE FALSE 
# [3,] TRUE TRUE TRUE TRUE FALSE 
# [4,] FALSE FALSE TRUE TRUE FALSE 

然後,bm可用於子集僅感興趣的元素:

d[bm] 
#[1] 37 26 27 30 33 30 34 28 28 35 38 

對於其將計算總和的微不足道:

sum(d[bm]) 
# [1] 346 

或數目元素:

length(d[bm]) 
# [1] 11 

希望它有幫助。

+0

非常感謝。唯一的問題是(並使用上面的矩陣作爲例子)一旦我找出哪些元素滿足條件(在你的情況d> = 25),我需要找到右邊49列的數據元素。我想要做的是確定某個數據元素是否滿足條件,如果是,找到距離爲49列的元素。雖然我可以用手工完成,但是我的數據集有14,000行,我爲什麼要用R – Yohnny

+0

來做這件事。你可以做'bm <- (d > = 25&(ncol(d) - col(d)<49))' –