0

この問題はかなり長い間私を悩ませてきました。私はいつもforループでそれを回避していますが、これを行うためのより迅速でエレガントな方法を見つける時がやっと来たと思います。

例として、アイテムが赤か青かに関する情報を含むデータフレームがあるとします。情報は次のように表示されます。

item.df <- data.frame(Item=seq(1,5), Red=c("Y", "Y", "N", "N", "N"), Blue=c("N", "N", "Y", "Y", "N"))

明らかに、これはこの情報を表すための最も凝縮された方法ではありません。2つの別々の赤と青の列を用意する代わりに、「赤」、「青」、または「どちらでもない」を含む1つのアイテムの色の列が必要です(またはNAも使用できます)。

明らかに、これは、空のItem.Color列を作成し、個々の行をループして入力することで実現できます。しかし、これを行うためのより迅速な方法があると確信しています。

私が真のR初心者だった頃、私は次の方法でそれをやろうとしました。

item.df$Item.Color <- if(item.df$Red=="Y"){"Red"}

しかし、ifステートメントはitem.df $ Redの最初の要素のみを読み取るため、これが機能しないことをすぐに知りました。

do.call()またはapply()関数の1つを使用してこれを実現する方法はありますか?私は試みましたが、私が望んでいたことを完全に実行させることはできませんでした。あなたが提供できるかもしれない洞察を事前に感謝します!

psまた、この質問のより良いタイトルの提案を聞いていただければ幸いです。私にとって、それは常に質問をする上で最も難しい部分のようです。

4

2 に答える 2

2

Red次のコードでうまくいくはずです。データにとが両方ともBlueTRUE( )である行が含まれているかどうかもチェックします== "Y"

item.df[["condensed"]] <- NA
item.df = within(item.df, {
  if(any(Red == "Y" & Blue == "Y")) stop("Blue and red cannot both be TRUE")
  condensed[Red == "Y"] <- "Red"
  condensed[Blue == "Y"] <- "Blue"
})

ここでの秘訣は、サブセットを取得するための同じ構文を代入に使用できることです。

# Getting a subset from a vector
A[B > 2]
# Or assigning NA to that subset 
A[B > 2] <- NA
于 2012-10-15T14:50:12.683 に答える
2

@Paulの 答えが好きですが、組み合わせを貼り付けて因数分解することで、これを非常に簡単に行うこともできます。ファクターにラベルを割り当てるときは、レベルがデフォルトでアルファベットであることに注意してください(したがって、c("NN", "NY", "YN", "YY")):

item.df <- data.frame(Item=seq(1, 6), 
                      Red=c("Y", "Y", "N", "N", "N", "Y"), 
                      Blue=c("N", "N", "Y", "Y", "N", "Y"))

item.df$Item.Color <- factor(paste0(item.df$Red, item.df$Blue),
                             labels = c("Neither", "Blue", "Red", "Both"))
item.df
#   Item Red Blue Item.Color
# 1    1   Y    N        Red
# 2    2   Y    N        Red
# 3    3   N    Y       Blue
# 4    4   N    Y       Blue
# 5    5   N    N    Neither
# 6    6   Y    Y       Both
于 2012-10-15T16:19:16.787 に答える