我可能有一个愚蠢的问题,但我无法理解它背后的逻辑。
Question 1:
a = c(10,20,30)
b = c(15,30,45)
c = cbind(a,b)
for ( i in 1:ncol(c))
{d[i] = c[i]+2}
print(d)
# Error d not defined
然后我想也许我需要一个占位符来解决这个问题,所以我做了以下几点:
Question 2:
d = matrix(NA, 3,2) # now have the same dimension as c
for ( i in 1:ncol(c)){d[i] = c[i]+2}
输出
[,1] [,2]
[1,] 12 NA
[2,] 22 NA
[3,] NA NA
我无法解释上面的输出。我不明白为什么我在第3行得到NA。
我也尝试了以下内容:
for ( i in 1:ncol(c)){d[,i] = c[,i]+2}
然后我得到了正确的答案,但是当我尝试以下操作时出现错误:
Question 3:
for ( i in 1:ncol(c)){d[i] = c[,i]+2}
Warning messages:
1: In d[i] = c[, i] + 2 :
number of items to replace is not a multiple of replacement length
2: In d[i] = c[, i] + 2 :
number of items to replace is not a multiple of replacement length
我知道我已经问了很多问题,但是如果你能为一个假人回答它们,我会非常感激。
答案 0 :(得分:1)
如果你的工作区中没有d
,那么它将返回一个错误,因为通过索引到尚未定义的对象的赋值是......,没有定义。如果您已将d
定义为空数字向量,那么您将获得:
d <- numeric(0)
for ( i in 1:ncol(c))
{d[i] = c[i]+2}
print(d)
#[1] "12.00" "22.00" # since `c` at that point was a two column matrix but c[1] and c[2]
# are just single values because of the way matrix indexing works.
因此,我们并不真正知道“为什么”,在您的情况下,这就是结果,但我们知道d
已经在您的工作区内,并且可能是尺寸为3x2的矩阵。
您似乎混淆了数据帧和矩阵的索引。如果M是矩阵,则M [1]是与M [1,1]相同的第一个元素,这与D是数据帧的情况相反,那么D [1]是第一列的整体,可能是非常的长矢量,与D [1,1]不同,长度为1,M [1,1]。还有一个潜在的混淆(你还没有展示)R的新手在数据框上使用“长度”,而不是返回行数,而是只看到列数。
答案 1 :(得分:0)
我知道回答你自己的问题是一个不好的做法,但我想我可以在广泛搜索后给出一个非常虚拟的答案。
Question 1:
As previous mentioned this will give an error as followings:
#Error in d[i] = c[i] + 2 : object 'd' not found
为什么呢? 因为“d”不存在,所以当c [i]等于1时,即10,并加2,得到12.结果不能放在“d”,因为“d”不存在,即未定义。要解决这个问题,你需要定义“d”,这就是我在问题2中所做的。定义意味着在运行for-loop语句之前你需要创建一个空的地方来存储结果,这不是这里的情况,因此R将产生错误。
Question 2:
d = matrix(NA, 3,2) # now have the same dimension as c
for ( i in 1:ncol(c)){d[i] = c[i]+2}
#[1] 12 22 NA NA NA NA
为什么呢?这里1:ncol(c)等于1&amp; 2,因为只有2列a&amp; b。当c [1]等于10时,c [2]等于20.这是索引而不是列。换句话说,列“a”包含(10,20,30),但c [1]是列“a”的第一个元素,它是10,c [2]是第二个元素,它是20,依此类推。这与c [,1](看1之前的逗号)不同,它会给你一个列“a”的向量,即(10,20,30)。代码将按以下方式工作:
when i is equal to 1 then c will be equal to 10
the first element of matrix d will be equal to
d[1] = 10 +2
d = 12 continuing.... now i = 2
d[2] = 20 +2
d= 22
因为我只有第1列和第1列2即“i”只能是1&amp; 2,剩余输出为NA。
Question 3:
for ( i in 1:ncol(c)){d[i] = c[,i]+2}
#Warning messages:
# 1: In d[i] = c[, i] + 2 :
#number of items to replace is not a multiple of replacement length
#2: In d[i] = c[, i] + 2 :
#number of items to replace is not a multiple of replacement length
#[1] 12 17 NA NA NA NA
这里的主要问题是c [,i]将采用第1列和第2列的元素,但d [i]是索引,即当“i”= 1时,则d [i]将是第一个元素因为我们只有2列,所以答案的其余部分将是NA。要了解它是如何工作的,我们来看看代码
when i is equal to 1 then c[,1] = 10
d[i] = 10 +2 = 12
The result 12 will be placed in the first element of matrix d
when i is equal to 2 then c[,2] = 15
d[i] = 15+2 = 17
The result 17 will be placed in the second element of the matrix d
因此输出结果如下:
[,1] [,2]
[1,] 12 NA
[2,] 17 NA
[3,] NA NA
还要注意数字17的位置。这是第2列的第一个元素的结果,但是它被放置在矩阵d的第二个元素中。这非常危险。