以下のRデータフレームのアドバイスを探しているエキスパート、特定の都市内の各ゾーンの関係を構築する必要があります。Rデータフレーム作成一対一の関係
入力:
mydf = data.frame(City = c("LA", "LA", "LA", "NYC", "NYC"),
Zone = c("A1", "A2", "A3", "B1", "B2"))
予想される出力:
以下のRデータフレームのアドバイスを探しているエキスパート、特定の都市内の各ゾーンの関係を構築する必要があります。Rデータフレーム作成一対一の関係
入力:
mydf = data.frame(City = c("LA", "LA", "LA", "NYC", "NYC"),
Zone = c("A1", "A2", "A3", "B1", "B2"))
予想される出力:
はここ組み合わせ&のための関数を定義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)
パーフェクト。ありがとうございました!! – Kg211
これはほぼ確実に物事を行うための最も効率的な方法ではありませんが、それは意志仕事とそれはほとんど読める。
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
パーフェクト。予想通り。ありがとうございました!! – Kg211
の2行目にタイプミスがあります出力テーブル? (A1、A2)を2回繰り返す。代わりに(A1、A3)にする必要がありますか? –
はい、あなたの権利です。 (A1、A3) – Kg211
あなたは 'melt(crossprod(table(mydf))')を使ってほぼそこに行くことができますが、期待される結果を得るには 'temp < - crossprod(table(mydf)); diag(temp)< - NA; r < - reshape2 :: melt(temp、na.rm = TRUE); r [r $ value == 1] ' – user20650