2016-11-08 5 views
-2

私は10種類のオブジェクトを持っています:a1、a2、... a10。 私がする必要があるのは、各変数を簡単に変更することだけです。そのようなどうすればループ内のA1、A2、...、Anのような変数を扱うことができますか? in R

a1$x <- a1$x + 1 
a2$x <- a2$x + 1 
... 
a10$x <- a10$x + 1 

a1[,'new_x']<-cumprod(a1$x) 
a2[,'new_x']<-cumprod(a2$x) 
... 
a10[,'new_x']<-cumprod(a10$x) 

として私は 'の' ループを使用してこれらのコードを縮小したいです。 試しました

for(i in 1:10) { 
ai[,'new_x'] <- cumprod(ai$x) 
} 

もちろん動作しません。 この作業を行う方法はありますか?

+1

lapply使用 '(リスト(A1、A2、...、A10)、関数(x)はx + 1)' – mtoto

+0

はR配列を有していませんか? – csmckelvey

+0

はい、それはどのような種類のオブジェクト 'a1、a2..'ですか? – mtoto

答えて

0

に変更を加えることがdplyrを使用してオブジェクト。例えば:

a1 <- data.frame(x=1:5) 
a2 <- data.frame(x=2:6) 
a3 <- data.frame(x=3:7) 

for(i in 1:3) { 
    dfname <- paste0("a", i) 
    df <- eval(parse(text=dfname)) 
    df$new_x <- cumprod(df$x) 
    assign(dfname, df) 
} 

a1 
+0

ありがとうございました。これは本当に必要な答えです。 –

1

名前の一部をイテレータiで置き換えてオブジェクトを呼び出すことができないため、これは機能しません。反復処理を行う場合は、最初にあるオブジェクト内のオブジェクトをlistまたはdata.frameのようにグループ化する必要があります。あなたのコードから、私はオブジェクトがdata.framesであると推測するので、ここで最も論理的なものはlistにそれらを格納することです。あなたがRで家族を適用し使用することができますforループへ

a1 <- data.frame(x = 1:10) 
a2 <- data.frame(x = 11:15) 
a3 <- data.frame(x = 16:30) 

a_list <- list(a1, a2, a3) 

for(i in 1:length(a_list)){ 
    a_list[[i]]$x <- a_list[[i]]$x + 1 
    a_list[[i]]$x_new <- cumsum(a_list[[i]]$x) 
} 

代替が、これはビットクリーンなコードになります。

a_list <- list(a1, a2, a3) 

lapply(a_list, function(df) { 
    df$x <- df$x + 1 
    df$x_new <- cumsum(df$x) 
    return(df) 
}) 

データフレームが全く同じ構造を持っている場合、それはより一層便利行が発信されたデータフレームから追加ID列と1つのデータフレームのすべてを結合することです。そして、あなたが書くためにオブジェクトやassign()機能を読み取るためにeval()機能を使用する場合は、最初に単一のリストやデータフレームにオブジェクトを変換することなく、あなたのループのアプローチを使用することができ、それ

library(dplyr) 
a_df <- rbind(a1 %>% mutate(df = 1), a2 %>% mutate(df = 2), a3 %>% mutate(df = 3)) 
a_df %>% mutate(x = x + 1) %>% group_by(df) %>% mutate(x_new = cumsum(x)) 
+0

答えをありがとう!私もあなたのコードを試します:) –

関連する問題