4

私は2つのdata.framesを持っています:

pattern <- data.frame(pattern = c("A", "B", "C", "D"), val = c(1, 1, 2, 2))

match <- data.frame(match = c("A", "C"))

data.frame パターンに new_val という別の列を追加し、列パターンの値が data.frame 一致にある各行に「X」を割り当て、それ以外の場合は「Y」を割り当てます

is.element(pattern$pattern, match$match)

[1] 真 偽 真 偽

したがって、結果の data.frame は次のようになります。

    pattern val new_val
1   A       1   X
2   B       1   Y
3   C       2   X
4   D       2   Y

私は醜いforループでそれを行うことに成功しましたが、これは派手なものを使用して1行のRコマンドでほぼ実行できると確信しています:-)

誰でも助けることができますか?

どうもありがとう!

4

2 に答える 2

3

タイラーが「1つのライナーが必要な場合はdata.tableがそれを行う可能性が高い」と言ったので、私はこれを実際に投稿しているだけです。matchまた、に名前が変更されたと想定していますmat

  pattern$new_val <- c("Y", "X")[(pattern$pattern %in% mat)+1]
  pattern
#  pattern val new_val
#1       A   1       X
#2       B   1       Y
#3       C   2       X
#4       D   2       Y

pattern$pattern %in% matパターンのどの要素がマットにあるかを検出します。マットにある場合はTRUEを返し、そうでない場合はFALSEを返します。次に、1を追加して、1〜2の範囲の数値にし、インデックス作成に使用できるようにします。次に、それを自己定義ベクトルのインデックスとして使用します。c("Y", "X")作成したインデックスは常に1または2であるため、関心のある要素を常に取得できます。したがって、この場合、パターンがマットにない場合は「Y」を、マットにある場合は「X」を取得します。これは、必要なものです。

于 2012-07-16T13:59:42.967 に答える
2

これが1つの方法です(この問題を解決するために実際に使用できる match という名前の非常に重要な基本関数があるため、 match の名前を mat に変更しました。実際に%in%は次の形式ですmatch

pattern <- data.frame(pattern = c("A", "B", "C", "D"), val = c(1, 1, 2, 2))
mat <- c("A", "C")

pattern$new_val <- "Y"                            #pre allot everything to be Y
pattern$new_val[pattern$pattern %in% mat] <- "X"  #replace any A or C with an X
pattern

PS が必要な場合は、1 つのライナーで十分data.tableでしょう。

もう少し複雑なものが必要な場合は、私が取り組んでいるパッケージの関数を使用できます。

library(qdap)

#original problem
pattern$new_val <- text2color(pattern$pattern, list(c("A", "C")), c("X", "Y"))

#extending it
#makes D  a 5
text2color(pattern$pattern, list(c("A", "C"), "D"), c("X", 5, "Y"))

この関数は実際には別のことを行うように設計されていますが、その重要な部分を取得したい場合は、ソース コードを確認できます。

于 2012-07-16T13:20:41.083 に答える