我是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)
但我没有让它在我的代码上工作。
所以任何建议都会非常有用。
答案 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