3

我对 R 很陌生,我想学习如何编写循环来创建和处理多个列。

我在 R 中导入了一个包含 23 个变量的数据的表。对于所有这些变量,我想计算人均值乘以 1000,然后将数据写入新表或与旧数据在同一个表中。

因此,对于这一列,我的操作如下所示:

<i>agriculture<-cbind(agriculture,"Total_value_per_capita"=agriculture$Total/agriculture$Total.Population*1000)</i>

现在我要问如何在 23 个变量的循环中执行此操作,这样我就不必编写 23 行类似的代码。

我认为该解决方案可能看起来与粘贴在此线程中的代码非常相似:

循环在 R 中创建多个矩阵(可能使用粘贴)

但我没有让它在我的代码上工作。

所以任何建议都会非常有帮助。

4

2 回答 2

1

我总是倾向于使用适当的 *ply 函数而不是 R 中的循环。在这种情况下sapply,可能是你的朋友:

df <- data.frame( a=sample(10), b=sample(10), c=sample(10) )
df.per.capita <– as.data.frame(
  sapply(
    df[ colnames(df) != "c" ], function(x){ x/df$c *1000 }
  )
)

对于更复杂的情况,您绝对应该看一下plyr包装。

于 2012-10-30T13:22:22.567 回答
1

这可以使用sweep函数来完成。使用比斯特菲尔德的数据生成但设置种子可以获得相同的结果

set.seed(001)
df <- data.frame( a=sample(10), b=sample(10), c=sample(10) )
per.capita <- sweep(df[,colnames(df) != "c"], 1, STATS=df$c, FUN='/')*1000
per.capita
           a          b
1   300.0000   300.0000
2  2000.0000  1000.0000
3   833.3333  1000.0000
4  7000.0000 10000.0000
5   222.2222   555.5556
6  1000.0000   875.0000
7  1285.7143  1142.8571
8  1200.0000   800.0000
9  3333.3333   333.3333
10  250.0000  2250.0000

与比斯特菲尔德的结果比较:

all.equal(df.per.capita, per.capita)
[1] TRUE
于 2012-10-30T13:33:31.147 回答