3

私は R にまったく慣れていないので、複数の列を作成して処理するループを作成する方法を学びたいと思っています。

23 個の変数を持つデータを含むテーブルを R にインポートしました。これらすべての変数について、1 人あたりの値を計算し、これに 1000 を掛けて、データを新しいテーブルに書き込むか、古いデータと同じテーブルに書き込みます。

したがって、1つの列のみに対して、私の操作は次のようになりました。

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

今、23 の変数のループでこれを行う方法を尋ねているので、23 の同様のコード行を記述する必要はありません。

解決策は、このスレッドに貼り付けられたコードと非常によく似ていると思います。

Rでいくつかのマトリックスを作成するためのループ(おそらくペーストを使用)

しかし、私のコードではうまくいきませんでした。

したがって、任意の提案は非常に役立ちます。

4

2 に答える 2

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パッケージを確認する必要があります。

于 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 に答える