我对R很陌生,我想在R中尝试不同的东西。 我创建了一个数据帧,我想使用for循环来选择负值的数量。我想将此数字添加到数据框中的新列。我知道有更简单的方法可以做到这一点,但我真的想在R中获得循环。 你们有没有人对我有任何建议?我将在下面发布我的数据框。
newframe< - data.frame(V1 = runif(500,min = -2,max = 2), V2 = runif(500,min = -2,max = 2))
提前致谢!
答案 0 :(得分:1)
是的,有更简单的方法可以做到这一点,但我会给你一些关于循环的建议。 首先,让我们创建一个额外的列:
nf=data.frame(newframe,neg=rep(NA)) #I called the column "neg"
其次,您必须定义循环开始和结束的范围:
for (i in 1:length(newframe[,1])) {
}
在循环内部,如果您只想要负数,则必须使用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;
}