4

これは、この質問のフォローアップです: データフレームの観察を複製するだけでなく、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" 

既存の「色」変数と一緒にこれらの組み合わせを取得し、新しい「値」変数を追加する方法についてのアイデアは大歓迎です。

4

1 に答える 1

5

私はこれを手早く行ったばかりなので、すべての条件をキャプチャできるかどうかはわかりませんが、うまくいくようです。

my cSplitfunctionを使用して、ほぼ同じポイントから開始し、次のように 2 回ネストします (ただし、今回は ID を追加します)。

library(devtools)
source_gist(11380733)
temp <- cSplit(cSplit(cbind(id = 1:nrow(df), df),
                      "alpha", ",", "long"), 
               "beta", ",", "long")

新しいものは次のとおりです。

SD <- c("alpha", "beta")
## Convert "alpha" and "beta" to numeric
temp[, (SD) := lapply(.SD, as.numeric), .SDcols = SD]

## Sort your alphas and betas, and check for duplicates
##   and any points where alpha equals beta
temp[, toDrop := duplicated(
  paste(pmin(alpha, beta), pmax(alpha, beta))) |
    alpha == beta, by = id]

## Create your "value" column
temp[, value := ifelse(any(toDrop), 0.5, 1), by = id]

## Subset and drop the irrelevant columns
out <- temp[!temp[, toDrop, with = TRUE]][, toDrop := NULL]

これは出力です:

out
#     id alpha beta  color value
#  1:  1     1    2    red   1.0
#  2:  1     1    4    red   1.0
#  3:  2     3    4 yellow   0.5
#  4:  3     2    1    red   1.0
#  5:  3     4    1    red   1.0
#  6:  3     5    1    red   1.0
#  7:  4     2    3 yellow   1.0
#  8:  5     1    3    red   1.0
#  9:  6     3    1 yellow   1.0
# 10:  6     3    4 yellow   1.0
# 11:  7     1    2    red   0.5
# 12:  8     1    2 yellow   0.5
# 13:  8     1    3 yellow   0.5
# 14:  8     2    3 yellow   0.5
于 2014-09-18T06:29:49.000 に答える