我试图理解r中的for和if语句,所以我运行一个代码,我说如果行的总和大于3则返回1,否则为0: 这是代码
set.seed(2)
x = rnorm(20)
y = 2*x
a = cbind(x,y)
hold = c()
现在来了if语句
for (i in nrow(a)) {
if ([i,1]+ [i,2] > 3) hold[i,] == 1
else ([i,1]+ [i,2]) <- hold[i,] == 0
return (cbind(a,hold)
}
我知道可能合并,如果可能不理想,但我只是想了解出了什么问题。请保持虚拟级别的解释:)谢谢
答案 0 :(得分:3)
您遇到了一些问题。 @mnel提供了一个更好的方法来实现这一目标,我将专注于理解这次尝试出了什么问题(但不要这样做,使用矢量化溶液)。
for (i in nrow(a)) {
a
有20行。 nrow(a)
为20.因此,您的代码相当于for (i in 20)
,这意味着i
只会是20。修复:
for (i in 1:nrow(a)) {
if ([i,1]+ [i,2] > 3) hold[i,] == 1
[i,1]
不是什么,它是i
行和第一列......没有。您需要引用您的数据:a[i,1]
您已将hold
初始化为向量c()
,因此它只有一个维度,而不是行和列。因此,我们要分配给hold[i]
,而不是hold[i,]
。
==
用于进行相等性测试。 =
或<-
用于转让。现在,如果符合>3
条件,则检查hold[i,]
是否等于1
。 (并且不对结果做任何事情)。
修复:
if (a[i,1]+ a[i,2] > 3) hold[i] <- 1
else ([i,1]+ [i,2]) <- hold[i,] == 0
如上所述,分配与平等测试。 (这里你使用箭头分配,但把它放在错误的地方 - 好像你正试图分配给其他人一样)
else
条件未满足时, if
就会发生,您不需要尝试重复该条件
修正:
else hold[i] <- 0
for (i in 1:nrow(a)) {
if (a[i,1] + a[i,2] > 3) hold[i] <- 1
else hold[i] <- 0
}
您并没有使用花括号作为if和else表达式。对于单行表达式,它们不是 required (如果有的话就是这一行)。它们是多行所必需的(如果有什么东西可以做),但我认为它们是一个好主意。另外,在R中,将else
与}
中的if
放在同一行上(在for
循环内部或功能它并不重要,但除此之外它会,所以养成一直做这件事的习惯是好事。我会推荐这个重新格式化的代码:
for (i in 1:nrow(a)) {
if (a[i, 1] + a[i, 2] > 3) {
hold[i] <- 1
} else {
hold[i] <- 0
}
}
ifelse
ifelse()
是R中的向量化if-else语句。当您想要测试条件向量并为每个条件得到结果时,它是合适的。在这种情况下,您可以像这样使用它:
hold <- ifelse(a[, 1] + a[, 2] > 3, 1, 0)
ifelse
会照顾你的循环。如果您希望将其作为数据中的列,请直接指定(无需先初始化)
a$hold <- ifelse(a[, 1] + a[, 2] > 3, 1, 0)
答案 1 :(得分:2)
R
中的此类操作很好地被矢量化。[
(例如a[i,1]
)使用rowSums
h <- rowSums(a) > 3
答案 2 :(得分:0)
我将假设你是R的新手,并试图了解for循环本身的基本功能。 R具有称为“应用”功能的奇特函数,专门用于对数据帧的每一行进行基本数学运算。我不打算谈论这些。
您希望在数组的每一行上执行以下操作。
对于1,幸运的是“sum”是built in function。在每种编程语言中检查内置函数是值得的,因为它们可以节省您的时间。要汇总行的元素,只需使用sum(a[row_number,])
。
对于2,您正在评估逻辑语句“是x&gt; 3?”其中x是1的结果。“&gt; 3”语句返回值true或false。逻辑表达式是一个花哨的“if then”语句,没有“if then”。
> 4>3
[1] TRUE
> 2>3
[1] FALSE
对于3,真值或假值是R中称为“逻辑”值的数据结构.1或0值是R中称为“数值”值的数据结构。通过将“逻辑”转换为“数字”,您可以将TRUE更改为1,将FALSE更改为0。
> class(4>3)
[1] "logical"
> as.numeric(4>3)
[1] 1
> class(as.numeric(4>3))
[1] "numeric"
for循环有一个min,max,一个计数器和一个可执行文件。计数器从最小值开始,然后递增,直到达到最大值。可执行文件将在每次运行计数器时运行。您从第一行开始,然后转到最后一行。将所有元素放在一起就像这样。
for (i in 1:nrow(a)){
hold[i] <- as.numeric(sum(a[i,])>3)
}