2017-09-14 14 views
0

以下のRデータフレームのアドバイスを探しているエキスパート、特定の都市内の各ゾーンの関係を構築する必要があります。Rデータフレーム作成一対一の関係

入力:

mydf = data.frame(City = c("LA", "LA", "LA", "NYC", "NYC"), 
      Zone = c("A1", "A2", "A3", "B1", "B2")) 

enter image description here

予想される出力:

Output

+0

の2行目にタイプミスがあります出力テーブル? (A1、A2)を2回繰り返す。代わりに(A1、A3)にする必要がありますか? –

+0

はい、あなたの権利です。 (A1、A3) – Kg211

+0

あなたは 'melt(crossprod(table(mydf))')を使ってほぼそこに行くことができますが、期待される結果を得るには 'temp < - crossprod(table(mydf)); diag(temp)< - NA; r < - reshape2 :: melt(temp、na.rm = TRUE); r [r $ value == 1] ' – user20650

答えて

0

はここ組み合わせ&のための関数を定義tidyverseアプローチは、各都市のゾーンにそれを適用しています:

library(dplyr); library(tidyr); library(purrr) 

generate_combinations <- function(data){ 
    zone <- data %>% select(Zone) %>% unlist() 
    combinations <- expand.grid(Zone_1 = zone, Zone_2 = zone) # generate all combinations 
    combinations <- combinations %>% 
    filter(!(Zone_1 == Zone_2)) %>% # remove invalid combinations 
    mutate_all(as.character) 
    return(combinations) 
} 

mydf <- mydf %>% 
    nest(Zone) %>% 
    mutate(data = map(data, generate_combinations)) %>% 
    unnest() 

> mydf 

    City Zone_1 Zone_2 
1 LA  A2  A1 
2 LA  A3  A1 
3 LA  A1  A2 
4 LA  A3  A2 
5 LA  A1  A3 
6 LA  A2  A3 
7 NYC  B2  B1 
8 NYC  B1  B2 

# if City info is no longer needed 
mydf <- mydf %>% select(-City) 

データ:

mydf = data.frame(City = c("LA", "LA", "LA", "NYC", "NYC"), 
        Zone = c("A1", "A2", "A3", "B1", "B2"), 
        stringsAsFactors = F) 
+0

パーフェクト。ありがとうございました!! – Kg211

0

これはほぼ確実に物事を行うための最も効率的な方法ではありませんが、それは意志仕事とそれはほとんど読める。

library(tidyverse) 
library(magrittr) 

output <- mydf %>% 
    split(., f=mydf[, "City"]) %>%     # Split into data.frames by "City" 
    sapply(., function(x) use_series(x, Zone)) %>% # Extract zones 
    sapply(combn, 2) %>%        # Find all combinations of size 2 
    do.call("cbind", .) %>%       # Combine them into a data frame 
    t %>% 
    as.data.frame %>% 
    rbind(., data.frame(V1=.$V2, V2=.$V1))   # Add it to the inverse, to get all possible combinations 

colnames(output) <- c("Zone_1", "Zone_2")   # Rename columns 



output 
     Zone_1 Zone_2 
1  A1  A2 
2  A1  A3 
3  A2  A3 
4  B1  B2 
5  A2  A1 
6  A3  A1 
7  A3  A2 
8  B2  B1 
+0

パーフェクト。予想通り。ありがとうございました!! – Kg211

関連する問題