4

为什么我不能为数据框的整个列赋值,然后在同一个“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 不了解的东西?

4

2 回答 2

3

我的猜测是,新列的分配是在您“离开”该功能时完成的。做的时候

c <- 1
c[2] <- 20

你真正创造的只是一个向量c <- c(1, 20)。当 R 必须将其分配给新列时,向量将被回收,创建您所看到的 1,20,1,20,... 模式。

于 2012-09-29T22:32:03.160 回答
2

这是一个有趣的。

它与仅定义到长度 2 的事实有关c,然后典型的 R“回收规则”接管并重复c,直到它与数据帧的长度匹配。(顺便说一句,这仅适用于整数倍数:您将无法在 10 个 10 行的数据框中复制长度为 3 或 4 的向量。)

回收有其批评者。我认为它是动态类型解释语言 R 的一项资产,尤其是当人们想要交互式地探索数据时。“扩展”数据以适应容器和表达式通常是一件好事——即使它在这里给出了奇怪的谜题。

于 2012-09-29T22:33:15.483 回答