为什么我不能将值分配给数据帧的整个列,然后是同一个“within”语句中的单个元素?代码:
foo <- data.frame( a=seq(1,10) )
foo <- within(foo, {
b <- 1 # set all of b to 1
})
foo <- within(foo, {
c <- 1 # set all of c to 1
c[2] <- 20 # set one element to 20
b[2] <- 20
})
foo
给出:
a b c
1 1 1 1
2 2 20 20
3 3 1 1
4 4 1 20
5 5 1 1
6 6 1 20
7 7 1 1
8 8 1 20
9 9 1 1
10 10 1 20
b的值是我的预期。 c的值很奇怪。如果对整个列的分配(即b <-1)与单个元素的赋值(即b [2] < - 20)在不同的“内部”语句中,它似乎做了我所期望的。但如果他们在同一个“内部”,则不是。
这是一个错误,还是我对R不了解的事情?
答案 0 :(得分:3)
我的猜测是,当你“离开”这个功能时,新列的分配就完成了。做的时候
c <- 1
c[2] <- 20
你真正创造的是一个向量c <- c(1, 20)
。当R必须将其分配给新列时,向量将被回收,从而创建您正在看到的1,20,1,20 ......模式。
答案 1 :(得分:2)
这是一个有趣的。
这与c
仅定义长度为2的事实有关,之后典型的R“回收规则”接管并重复c
,直到它与长度匹配为止。数据框。 (另外,这只适用于整数倍:你不能在十个10行的数据帧中复制长度为3或4的向量。)
回收有其批评者。我认为它是动态类型解释语言R的资产,特别是当人们想要以交互方式探索数据时。 “扩展”数据以适应容器和表达通常是一件好事 - 即使它像这里一样给出了奇怪的谜题。