これは、この質問のフォローアップです: データフレームの観察を複製するだけでなく、R の特定の変数値を置き換える
必要な情報をすべて提供しながら、できるだけ簡潔に書くように努めました。この現在の例では、次のような df があります。
df<-data.frame(alpha=c(1, "3, 4", "2, 4, 5", 2, 1, 3, "1, 2", "1, 2, 3"),
beta=c("2, 4", "3, 4", 1, 3, 3, "1, 4", "1, 2", "1, 2, 3"),
color=c("red", "yellow"))
# alpha beta color
#1 1 2, 4 red
#2 3, 4 3, 4 yellow
#3 2, 4, 5 1 red
#4 2 3 yellow
#5 1 3 red
#6 3 1, 4 yellow
#7 1, 2 1, 2 red
#8 1, 2, 3 1, 2, 3 yellow
望ましい出力
最終的に次のようになりたいです (行の順序はそれほど重要ではありません)。
# alpha beta color value
#1 1 2 red 1
#2 1 4 red 1
#3 3 4 yellow 0.5
#4 2 1 red 1
#5 4 1 red 1
#6 5 1 red 1
#7 2 3 yellow 1
#8 1 3 red 1
#9 3 1 yellow 1
#10 3 4 yellow 1
#11 1 2 red 0.5
#12 1 2 yellow 0.5
#13 1 3 yellow 0.5
#14 2 3 yellow 0.5
複数の重複しない/一致しないエントリを持つアルファまたはベータの観測がある場合は常に、その観測が展開されます。たとえば、元の df の 1 行目には alpha="1" と beta="2, 4" があります。これらは、ベータの「2」と「4」で区切られた出力で 2 つの別個の行になります。変数「color」に保持される情報は、観測ごとに保持されます。さらに、新しい変数「値」は 1 になります。
この質問と前の質問の主な違いは、 alpha==beta の行が存在することです。
ここでは、重複ではなく、アルファとベータの一意の組み合わせのみを保持したいと考えています。たとえば、元の df の行 8 には alpha="1, 2, 3" と beta="1, 2, 3" があります。「alpha=1、beta=2」、「alpha=1、beta=3」、「alpha=2、beta=3」の別々の行が必要です。ここでも、'color' 変数が複製されます。ただし、ここでは値を「0.5」にする必要があります。
私が試したこと:
これをすべて 1 つで行う方法がわからなかったので、最初にアルファがベータと等しいかどうかに従って df をサブセット化しました。
x <- df[df$alpha!=df$beta,]
df$alpha<-as.character(df$alpha)
df$beta<-as.character(df$beta)
fun1 <- function(df){
df$alpha<-as.character(df$alpha)
df$beta<-as.character(df$beta)
do.call(rbind, with(df, Map(expand.grid,
alpha = strsplit(alpha, ", "),
beta = strsplit(beta, ", "),
color = color,
value = 1
)))
}
fun1(x)
与える:
alpha beta color value
#1 1 2 red 1
#2 1 4 red 1
#3 2 1 red 1
#4 4 1 red 1
#5 5 1 red 1
#6 2 3 yellow 1
#7 1 3 red 1
#8 3 1 yellow 1
#9 3 4 yellow 1
次に、 alpha==beta の観察結果、ここで行き詰まっています...
x2 <- df[df$alpha==df$beta,]
x2
# alpha beta color
#2 3, 4 3, 4 yellow
#7 1, 2 1, 2 red
#8 1, 2, 3 1, 2, 3 yellow
私の考えは、 を使用してデータを分割しstrsplit
、次に を使用combn
して、探している組み合わせを見つけて結合することでした。ただし、他の変数を複製したい場合、これはこのようには機能しません...
a<-strsplit(x2$alpha, ", ")
a.combs <- lapply(a, function(x) c(combn(x, 2, simplify=FALSE)))
matrix(unlist(a.combs),ncol=2, byrow=T)
与えます:
# [,1] [,2]
#[1,] "3" "4"
#[2,] "1" "2"
#[3,] "1" "2"
#[4,] "1" "3"
#[5,] "2" "3"
既存の「色」変数と一緒にこれらの組み合わせを取得し、新しい「値」変数を追加する方法についてのアイデアは大歓迎です。