使用for循环计算负值并添加到新列

时间:2017-01-28 13:33:13

标签: r for-loop select dataframe negative-number

我对R很陌生,我想在R中尝试不同的东西。 我创建了一个数据帧,我想使用for循环来选择负值的数量。我想将此数字添加到数据框中的新列。我知道有更简单的方法可以做到这一点,但我真的想在R中获得循环。 你们有没有人对我有任何建议?我将在下面发布我的数据框。

newframe< - data.frame(V1 = runif(500,min = -2,max = 2),                  V2 = runif(500,min = -2,max = 2))

提前致谢!

2 个答案:

答案 0 :(得分:1)

是的,有更简单的方法可以做到这一点,但我会给你一些关于循环的建议。 首先,让我们创建一个额外的列:

nf=data.frame(newframe,neg=rep(NA))   #I called the column "neg" 

其次,您必须定义循环开始和结束的范围:

 for (i in 1:length(newframe[,1])) {

}

评论:我直接写了长度(newframe [,1])而不是500。最好指出与您正在使用的对象链接的内容。例如,如果要向data.frame添加更多行,则会对其进行处理,并且您的循环仍然有效。

在循环内部,如果您只想要负数,则必须使用IF条件来获取它们: (我们在这里处理数据框的第一列,但您也可以在每个列上执行“for”循环)

 if(newframe[i,1]<=0){
  nf$neg[i]=newframe[i,1]
  }

然后你有第一列的解决方案!我让你独自完成第二栏:)

答案 1 :(得分:0)

首先获取数据集的行数和列数:

nr = NROW(newframe); # you can use the lowercase variant as well or the dim command
nc = NCOL(newframe);

然后循环遍历行和列:

response = 0;
for(ir in 1:nr) { // cycle through rows

    for(ic in 1:nc) { // cycle through columns
        response = response + ifelse(newframe[ir, ic]<0, 1, 0);
    }

}

response变量包含数据集的负值数。

循环就像for-each语句一样,让我们​​考虑外部for循环:ir将获取命令1:nr生成的系列的所有值(即{{ 1}},1,... 2)。

另一个例子是

nr

您将获得输出

x = c("a", "b", "c");
for(v in x) { 
    cat(v, "\n"); 
}

这意味着您可以使用单个for循环来获得相同的结果:

> a
b
c

如果您愿意,可以随时从for循环切换到while循环:

response = 0;
for(v in unlist(newframe)) { # you need to un-list the dataframe otherwise you would cycle through the columns...
    response = response + ifelse(v<0, 1, 0);
}

我希望我已经回答了您的问题response = 0; ir = 1; while(ir<=nr) { // cycle through rows ic = 1; while(ic<=nc) { // cycle through columns response = response + ifelse(newframe[ir, ic]<0, 1, 0); ic = ic + 1; } ir = ir + 1; }