2015-05-19 53 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))' –