2017-02-15 7 views
1

私は現在、農業データの大きな(ish)データフレーム(13,884行と57列)を扱っています。1つの列内の一意の行と2)特定の他の列のすべての値

データフレームの1つの列は、対象国の「地区」の名前で構成されています。また、複数作物の「生産下総面積」欄と、各調査に対応する「年」欄も含まれています。データフレームの簡易版:

Dist_names <- c('A', 'B', 'C', 'D') 
Rice_area <- rnorm(16, mean = 5, sd = 1) 
Random_var <- rep('blah', times = 16) 
Maize_area <- rnorm(16, mean = 3, sd = 1) 
Random_var1 <- rep('blah', times = 16) 
Wheat_area <- rnorm(16, mean = 7, sd = 1) 
Year  <- c(rep('1966', times = 4), rep('1971', times = 4), 
       rep('1984', times = 4), rep('1996', times = 4)) 

df_ag <- data.frame(Dist_names, 
        Rice_area, 
        Random_var, 
        Maize_area, 
        Random_var1, 
        Wheat_area, 
        Year) 
df_ag 

    Dist_names Rice_area Random_var Maize_area Random_var1 Wheat_area Year 
1   A 6.266559  blah 3.8740517  blah 7.775330 1966 
2   B 5.611816  blah 1.9078029  blah 7.497784 1966 
3   C 5.481312  blah 2.2931361  blah 6.556777 1966 
4   D 3.982654  blah 2.2146227  blah 6.899663 1966 
5   A 6.123487  blah 2.3746220  blah 6.537040 1971 
6   B 6.760871  blah 2.6296762  blah 6.994326 1971 
7   C 5.123877  blah 3.3364304  blah 7.348202 1971 
8   D 5.340764  blah 3.3026722  blah 6.316179 1971 
9   A 5.005836  blah 2.6335372  blah 7.031141 1984 
10   B 4.224905  blah 4.4294862  blah 7.822868 1984 
11   C 5.297800  blah 2.3048798  blah 4.287632 1984 
12   D 7.870687  blah 1.5812036  blah 6.171034 1984 
13   A 4.575766  blah 0.3331641  blah 6.971024 1996 
14   B 5.717461  blah 2.7911101  blah 7.396314 1996 
15   C 4.679965  blah 3.0742187  blah 5.575169 1996 
16   D 3.892069  blah 2.5029748  blah 7.660881 1996 

そうで、私は何をしようとしてることはyear変数の機能、およびプロットとして各crop_area変数の線形モデルを作成し、dist_names変数をループしています出力はabline()と一緒に出力されます。この作業を自動化する必要があります。これは332の固有の地区名があり、28の作物= 9296のプロットが生成されるためです。

私は、単一の作物の変数をループすることができるよと、次のようなコード使用してビジュアルを生成します。しかし、私はやることができるようにするためのコードを一般に困難な時期を過ごしてい

par(ask=TRUE) 
dists <- unique(df_ag$Dist_names) 
for (dis in dists) { 
    dat <- df_ag[df_ag$Dist_names == dis, ] 
    m <- lm(Rice_area ~ Year, data = dat) 
    plot(dat$Year, dat$Rice_area, main=paste0(dat$Dist_name[1], ', ', dis)) 
    abline(m) 
} 

を上記のすべてのcrop_area変数と同じことです。私の現在の考え方は、ネストされたループforで構成される関数が必要であるということです。最新の(動作しない)試みは次のとおりです:

par(ask=TRUE) 
graph_fun <- function(df, na.rm = TRUE) { 

    # find unique districts within dist_names 
    dists <- unique(df_ag$Dist_names) 

    # total area variables in data frame 
    ta_vars <- df_ag[grepl("area", names(df_ag))] 

    # loop through each district name 
    for (dis in dists) { 

    # loop through each crop variable 
    for (i in 1:ncol(ta_vars)) { 

     # new variable with each district and each crop   
     dat <- df_ag[df_ag$Dist_names == dis, ta_vars[i]] 

    } 

    # generate linear models and plots 
    m <- lm(dat[j], Year, data = dat) 
    plot(dat$Year, dat[j], main=paste0(dat$Dist_names[1], ', ', dis,)) 
    abline(m) 

    } 

} 

もちろん、上記のコードはトリックを行いません。 xの

エラー[J]:無効な添字タイプ「リスト」

どれでも私は、コードが間違っている、複数の領域があると確信しているが、私は現在、次のエラーを取得しています指導は非常に高く評価されるだろう。私は誰もがapplyファミリ機能でタスクを達成する方法を考えることができる場合、forループコンセプトと結婚していません。

+0

「crop_area」とは何ですか? Rice_area〜Year、Maize_area〜Year、Wheat_area〜Yearのモデルをやっているのですか? –

+0

'ta_vars'にはエリア変数の名前を入れたいと思いますが、ここではそれはカラムです。あなたは 'ta_vars < - df_ag [grepl(" area "、names(df_ag))]' 'を' ta_vars < - names(df_ag)[grepl( "area"、names(df_ag))] 'に置き換えてみてください。 (訳注:私は1:長さ(ta_vars))のためのループ呼び出し '' –

+0

また、あなたは確かに 'broom'パッケージを見てください。 –

答えて

1

私がこれをやっていたら、データを長いフォーマットに溶かし、データをスライスしてダイスする便利な機能の1つを使用します。

library(tidyr) 
xy <- gather(df_ag, key = crop, value = area, -Random_var, -Random_var1, -Year, -Dist_names) 
xy$Year <- as.numeric(as.character(xy$Year)) 


by(data = xy, INDICES = list(xy$Dist_names, xy$crop), FUN = function(x) { 
    mdl <- lm(area ~ Year, data = x) 
    plot(area ~ Year, data = x, type = "p") 
    abline(mdl) 

    return(mdl) 
    }) 

...しかし、おそらく混合エフェクトモデルが必要です。

これは、あなたが行っているプロットを生成します。

Dist_names <- c('A', 'B', 'C', 'D') 
Rice_area <- rnorm(16, mean = 5, sd = 1) 
Random_var <- rep('blah', times = 16) 
Maize_area <- rnorm(16, mean = 3, sd = 1) 
Random_var1 <- rep('blah', times = 16) 
Wheat_area <- rnorm(16, mean = 7, sd = 1) 
Year  <- as.numeric(c(rep('1966', times = 4), rep('1971', times = 4), 
       rep('1984', times = 4), rep('1996', times = 4))) 

df_ag <- data.frame(Dist_names, 
        Rice_area, 
        Random_var, 
        Maize_area, 
        Random_var1, 
        Wheat_area, 
        Year) 

graph_fun <- function(df) { 
    # find unique districts within dist_names 
    dists <- unique(df$Dist_names) 

    # total area variables in data frame 
    ta_vars <- df[grepl("area", names(df))] 

# browser() # if you enable this, it will, upon execution, stop the function here 
# you can then look around the function and run whichever bit of code you wish to poke around 
    par(mfrow = c(length(dists), ncol(ta_vars))) 

    # loop through each district name 
    for (dis in dists) { 

    # loop through each crop variable 
    for (ta_var in colnames(ta_vars)) { 

     # new variable with each district and each crop   
     dat <- df[df$Dist_names == dis, ] 

     # generate linear models and plots 
     m <- lm(formula(paste(ta_var, "~ Year"), data = dat)) 
     plot(dat$Year, dat[, ta_var], main=paste0(unique(dat$Dist_names), ', ', ta_var)) 
     abline(m) 
    } 

    } 
} 

graph_fun(df_ag) 

これは多くのレベルで機能しない可能性がありますので、一度にnレベルのレベルを作成するだけで調整する必要があります。

+0

区画と作物のタイプ別に整理された1つの区画にすべてのプロットを可視化するには、 'by()'関数の中で 'main = paste()'を追加すると、最初に 'par(mfrow = c(length(unique xy $ crop))、length(unique(xy $ Dist_names)))一意(x $ Dist_names)、一意(x $ crop)、sep = ":") 'を' plot() 'に変換します。これは、地区と作物の種類によってプロットのグリッドを表示します。 –

+0

上記コメントの出力例:http://i.imgur.com/O1utf9O.png –

+0

ありがとうございます。私はこのルートに行くことになるかもしれませんが、現在のワイドフォーマットのデータフレームを使ってこのタスクを達成する方法について誰かが考えているなら、それはまだ非常に役に立つでしょう。 –

関連する問題