-2

私は R を初めて使用するので、このサイトで私の質問に対する具体的なヘルプを見つけることができませんでした。

データフレーム $grant_database、country_1 から country_10 に 10 個の文字変数があります。それぞれの国コード (E20、F27、G10 など)、または NA のいずれかが含まれています。各ケースは、プロジェクトへの助成金です。10 の国変数は、助成金が恩恵を受ける国を指定します。私のデータフレームでは、すべてではありませんがほとんどのケースに少なくとも 1 つの国コードがあり、最初は country_1 にマークされています。多くの場合、country_2 にも 1 つ、country_3 から _10 にも 1 つ含まれています。空のフィールドはすべて NA でマークされます。

id  country_1  country_2  country_3  country_4  country_5  country_6 ...new_binaryvar
1   F20        NA         NA         NA         NA         NA           0        
2   E12        E17        E52        NA         NA         NA           0
3   O62        O33        NA         NA         NA         NA           0
4   E21        E20        NA         NA         NA         NA           1
5   NA         NA         NA         NA         NA         NA           0
...

定義された国のサブセットに利益をもたらす助成金にフラグを立てる新しい要素を作成したいと考えています。この 2 進数の「ダミー」変数は、10 の国変数のうち少なくとも 1 つが国コードのリストに対応する場合に値「1」を与える必要があります。10 の国変数のいずれにも対応する国コードがない各ケース/許可には「0」を指定する必要があります。フラグが立てられる国コードのこのサブセットを、E20、F27、および G10 とします (実際には、150 以上から約 40 のフラグが立てられます)。

これをプログラムする方法を提案して、私を助けてくれませんか? ご助力ありがとうございます!

4

1 に答える 1

0

特定の行に「国コード」の少なくとも 1 つが存在する場合、その行が「1」を取得するという条件で、「国コード」のサブセットが各「国」変数に存在するかどうかを確認したいと仮定すると、または「0」。v1アイデアは、チェックする必要がある「国コード」のベクトル ( ) を作成することです。dfデータセット ( ) を "id" 列を削除して行列に変換し ( ) as.matrix(df[,-1])、"v1" と比較して論理ベクトルを作成します ( %in%)。dim<-次元 ( ) をdf[,-1]ie ( )の次元に割り当てることにより、ベクトルを「行列」に戻すことができますc(5,7)。を実行しrowSums、二重否定 ( !!) を実行し、最後に加算0してバイナリ ダミー変数を取得します。

 v1 <- c('E20', 'F27', 'G10')
(!!rowSums(`dim<-`(as.matrix(df[,-1]) %in% v1, c(5,7))))+0
#[1] 0 0 0 1 0

新しいデータ

df <- structure(list(id = 1:5, country_1 = c("F20", "E12", "O62", "E21", 
NA), country_2 = c(NA, "E17", "O33", "E20", NA), country_3 = c(NA, 
 "E52", NA, NA, NA), country_4 = c(NA, NA, NA, NA, NA), country_5 = c(NA, 
NA, NA, NA, NA), country_6 = c(NA, NA, NA, NA, NA), country_7 = c(NA, 
NA, NA, NA, NA)), .Names = c("id", "country_1", "country_2", 
"country_3", "country_4", "country_5", "country_6", "country_7"
 ), class = "data.frame", row.names = c(NA, -5L))
于 2015-01-05T15:22:10.210 に答える