使用R中的循环创建和处理多个列

时间:2012-10-30 12:44:57

标签: r loops

我是R的新手,我想学习如何编写循环来创建和处理多个列。

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

所以对于这个只有一列,我的操作看起来像这样:

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

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

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

loop to create several matrix in R (maybe using paste)

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

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

2 个答案:

答案 0 :(得分:1)

我总是喜欢在R中的循环上使用适当的* ply函数。在这种情况下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包。

答案 1 :(得分:1)

这可以使用sweep函数完成。使用Beasterfield的数据生成但设置种子可以获得相同的结果

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

与Beasterfield的结果相比:

all.equal(df.per.capita, per.capita)
[1] TRUE