2016-10-03 8 views
-2

私は、特定のレコードが3つの異なる領域にある特定のストア番号に関連付けられているかどうかを示すイエス/ノー数のデータセットを持っています(つまり、レコードは変数名は、「領域」_「storenumber」)としてフォーマットされている3つの領域のそれぞれに2つの店舗の1:ペーストを使ったネストされたforループ

var1_1 var1_2 var2_1 var2_2 var3_1 var3_2 
1 Yes  No  No  Yes  Yes  No 
2 No  Yes  Yes  No  No  Yes 
3 No  Yes  Yes  No  No  Yes 
4 No  Yes  No  Yes  Yes  No 
5 No  Yes  No  Yes  No  Yes 
6 Yes  No  No  Yes  No  Yes 
7 Yes  No  Yes  No  Yes  No 
8 No  Yes  Yes  No  No  Yes 

私は「region_1」と呼ばれる地域ごとの変数を作成したいのですが(1または2)の「はい」の店舗番号と同じ「region_2」、「region_2」、および「region_3」を選択します。

region_1 region_2 region_3 
1 1   2   1 
2 2   1   2 
3 2   1   2 
4 2   2   1 
5 2   2   2 
6 1   2   2 
7 1   1   1 
8 2   1   2 

次のように私はループに使用して別々の可変各領域を作成することができています:

for(i in 1:3) { 
    df[paste("region_", toString(i), sep = "")] <- "" 
} 

for(i in 1:2) { 
    df$region_1 <- ifelse(df[paste("var1_", toString(i), sep = "")] == "Yes" & df$region_1 == "", toString(i), df$region_1) 
    } 

for(i in 1:2) { 
    df_1$region_2 <- ifelse(df_1[paste("var2_", toString(i), sep = "")] == "Yes" & df_1$region_2 == "", toString(i), df_1$region_2) 
} 

for(i in 1:2) { 
    df_1$region_3 <- ifelse(df_1[paste("var3_", toString(i), sep = "")] == "Yes" & df_1$region_3 == "", toString(i), df_1$region_3) 
} 

私の実際のデータは、多くの3つの以上の領域(地域ごとに2つ以上の店舗)を有しているので、よりもむしろ別個のループを書きます各地域ごとに、このループをすべての地域にわたってループするようにネストしたいと思います。私は、次のことをしようとしました:

for(j in 1:3) { 
    for(i in 1:2) { 
    df[paste("region_", toString(j), sep = "")] <- ifelse(df[paste("var", toString(j), "_", toString(i), sep = "")] == "Yes" & df[paste("region_", toString(j), sep = "")] == "", toString(i), df[paste("region_", toString(j), sep = "")]) 
    } 
} 

はなく、すべてのレコードに対して同じ単一の値が移入各地域の変数で終わる「#### 1つの変数を置き換えるために、変数を提供」の警告を受け取ります。

私の入れ子になったループでどこが間違っているのでしょうか?

答えて

0

我々は論理値にいいえはいとを変換する場合、我々は単に行うことができます

regions = as.data.frame(sapply(seq(1, NCOL(stores), by=2),function(j) ifelse(stores[,j],1,2))) 
names(regions) = c("region_1", "region_2", "region_3") 

regions 
# region_1 region_2 region_3 
#1  1  2  1 
#2  2  1  2 
#3  2  1  2 
#4  2  2  1 
#5  2  2  2 
#6  1  2  2 
#7  1  1  1 
#8  2  1  2 

データ:このため

library(data.table) 
stores = setDF(fread(gsub("No", "FALSE", gsub("Yes", "TRUE", 
"var1_1 var1_2 var2_1 var2_2 var3_1 var3_2 
Yes  No  No  Yes  Yes  No 
No  Yes  Yes  No  No  Yes 
No  Yes  Yes  No  No  Yes 
No  Yes  No  Yes  Yes  No 
No  Yes  No  Yes  No  Yes 
Yes  No  No  Yes  No  Yes 
Yes  No  Yes  No  Yes  No 
No  Yes  Yes  No  No  Yes")))) 
+0

ありがとうございました!これはより "r"なアプローチのようです。質問 - これは、 'regions'という正しい変数を作成するだけでしょうか?どのように私は3つの別々の領域変数 'region_1'、' region_2'、 'region_3'を作成するためにこれを適応させるでしょうか? –

+0

領域の列はすでにそれぞれの領域を探索していたので、領域[、x]を使用して領域xの値を取得できます。 「region_x」という名前で実際に参照する必要がある場合は、data.frameに変換してそれに応じて列名を付けることができます。方法を示すために編集されました。 – dww

+0

それは分かりました。実際には、これらの変数は(残念なことに)厄介なデータセットで何百もの他の人の間で生きています。私の最初のループセットアップは、これを回避することを意図していました(例えば、ifelse(stores [、j] –

0

は、あなた方にデータを変換務めすることができます現在の "ワイド"形式ではなく "ロング"形式を使用します。ここにはdplyrtidyrを使用した例があります。私は各行にコメントをつけようとしましたが、基本的なアイデアは店舗変数の測定ごとに1つの行を生成し、存在/不在を示すだけです。次に、行を地域別にグループ化し、「はい」の数を数えます。

# Data entry from @dww, without conversion to logical (though that would make it easier) 

library(data.table) 
stores = setDF(fread("var1_1 var1_2 var2_1 var2_2 var3_1 var3_2 
Yes  No  No  Yes  Yes  No 
No  Yes  Yes  No  No  Yes 
No  Yes  Yes  No  No  Yes 
No  Yes  No  Yes  Yes  No 
No  Yes  No  Yes  No  Yes 
Yes  No  No  Yes  No  Yes 
Yes  No  Yes  No  Yes  No 
No  Yes  Yes  No  No  Yes")) 

まだ長い形式で

longRegional <- 
    longStores %>% 
    # Set grouping 
    group_by(variableInterest, Region) %>% 
    # Count the number of correct values in the region 
    summarise(nStoresWithVariable = sum(present == "Yes")) 

最後に、あなたの元の要求に再フォーマット

longRegional %>% 
    spread(Region, nStoresWithVariable) 

# variableInterest `1` `2` 
# *   <chr> <int> <int> 
# 1    1  2  1 
# 2    2  1  2 
# 3    3  1  2 
# 4    4  1  2 
# 5    5  0  3 
# 6    6  1  2 
# 7    7  3  0 
# 8    8  1  2 
長い形式に変更し、地域によって新たな変数

longStores <- 
    stores %>% 
    # tag for printing 
    tbl_df() %>% 
    # Store the variable of interest as a column, instead of row.names 
    mutate(variableInterest = rownames(.)) %>% 
    # Convert the data to long format 
    gather(StoreID, present, -variableInterest) %>% 
    # Split the store_region format 
    separate(StoreID, c("Store", "Region"), sep = "_") %>% 
    # Eliminate the leading "var" from store names, just for display 
    mutate(Store = gsub("var", "", Store)) 

集計として店、

0

ここはmですTrueとFalseのようにあなたのデータのシミュレーションとyの厄介な試み:

模擬データ - データテーブルを生成し使用してランダムなブール

rb <- function() 
{ 
    sample(c(T,F), size=10, replace=TRUE, prob=c(0.5, 0.5)) 
} 

var1_1 = rb() 
var2_1 = rb() 
var3_1 = rb() 
df <- data.frame(var1_1, !var1_1, 
        var2_1, !var2_1, 
        var3_1, !var3_1) 

colnames(df) = c('var1_1', 'var1_2', 'var2_1', 'var2_2', 'var3_1', 'var3_2') 

DF

var1_1 var1_2 var2_1 var2_2 var3_1 var3_2 
1 FALSE TRUE TRUE FALSE FALSE TRUE 
2 FALSE TRUE FALSE TRUE FALSE TRUE 
3 FALSE TRUE TRUE FALSE TRUE FALSE 
4 FALSE TRUE TRUE FALSE FALSE TRUE 
5 FALSE TRUE FALSE TRUE TRUE FALSE 
6 FALSE TRUE FALSE TRUE TRUE FALSE 
7 TRUE FALSE TRUE FALSE TRUE FALSE 
8 TRUE FALSE FALSE TRUE TRUE FALSE 
9 TRUE FALSE FALSE TRUE TRUE FALSE 
10 FALSE TRUE FALSE TRUE TRUE FALSE 

ソリューション

cn <- names(df) 
cnprefixes <- gsub("_.*?$","",cn) 
cnsuffixes <- gsub("^.*?_","",cn) 

newblock<-data.frame() 
bFirstTime<-T 
for (prefix in unique(cnprefixes)) 
{ 
    block<-df[ , grepl(prefix , names(df)) ] 

    theseSuffixes <- cnsuffixes[startsWith(cn, prefix)] 

    j <- 1 
    for(suffix in theseSuffixes) 
    { 
    block[,j][block[,j]==T]=as.numeric(suffix) 
    j<-j+1 
    } 
    tempblock=data.frame(rowSums(block)) 
    colnames(tempblock)<- prefix 
    if (bFirstTime){ 
    newblock <- tempblock 
    bFirstTime <- F 
    } 
    else{ 
    newblock<-cbind(newblock, tempblock) 
    } 
} 

newblock

var1 var2 var3 
1  2 1 2 
2  2 2 2 
3  2 1 1 
4  2 1 2 
5  2 2 1 
6  2 2 1 
7  1 1 1 
8  1 2 1 
9  1 2 1 
10 2 2 1 
+0

ありがとう!私はあなたのループの使用に感謝します。私はかなり新しくr(Stataから来ている)ので、私はここで何が起こっているか完全にはわからない。特に、 'bFirstTime < - T'はあなたのアプローチの中でどのくらい正確に機能しますか? –

+0

私は一日中Cコードを書いていましたので、私の心は「ループ」モードになっていましたが、一般的にはRでループを避けたいと思っています。変数 'bFirstTime'は初めてです。これは、データフレーム 'tempblock'を空のデータフレーム 'newblock'にバインド(cbind参照)しようとしないためです。 –

+0

それを得ました - ありがとう! –

関連する問題