←
PDF 344 / 520 Output
→
English · PDF 344
Original PDF page 344
中文 · PDF 344

rng <- range(x, na.rm = TRUE) (x - rng[1]) / (rng[2] - rng[1]) } df$a <- rescale01(df$a) df$b <- rescale01(df$b) df$c <- rescale01(df$c) df$d <- rescale01(df$d)

要用 for 循环解决这个问题,我们再次思考这三个组成部分:

输出

我们已经有了输出——它和输入是一样的!

序列

我们可以把数据框看作一个列的列表,因此可以用 seq_along(df) 迭代每一列。

循环体

应用 rescale01()。

这给我们带来:

for (i in seq_along(df)) { df[[i]] <- rescale01(df[[i]]) }

通常你会用这种循环来修改列表或数据框,所以记得使用 [[,而不是 [。你可能已经注意到我在所有的 for 循环中都使用了 [[:我认为即使对于原子向量也最好使用 [[,因为这能清楚地表明我想操作单个元素。

循环模式

有三种基本方式可以对向量进行循环。到目前为止我向你展示的是最通用的方式:使用 for (i in seq_along(xs)) 对数字索引进行循环,并用 x[[i]] 提取值。还有另外两种形式:

  • 对元素进行循环:for (x in xs)。如果你只关心副作用,比如绘图或保存文件,这种方式最有用,因为很难高效地保存输出。
  • 对名称进行循环:for (nm in names(xs))。这会给你一个名称,你可以用它通过 x[[nm]] 访问对应的值。如果你想在绘图标题或文件名中使用该名称,这种方式很有用。