-2

調査のために組み合わせたい2つの調査データセットがあります。サンプルデータは次のようになります。

**Data A**
X      Y         Z  Participation (in %)
24    Black     10000      10
28    Hispanic  250000     12
54    White     20000      32
32    White     32000      14

**`Data B`**
    X       Y        Z   Crime (in %)
    24    Black     10000      4
    28    Hispanic  250000     3
    32    White     320000     5

データAとBには、共通のX、Y、Z変数があります。データAの一意の変数は参加であり、データBの一意の変数は犯罪です。これが私がやりたかったことです:

a。次のように、各データセットを9つのセルに分割します。

             Age group
   Race    24-40  41-50  51-60 
   White
  Hispanic
   Black

b。変数Zに基づいて各セルをランク付けします。

c。Bの観測ごとにAの10個の観測を含めます。

d。Aの観測数がBと等しくなるように、Aのランダムサンプルを抽出します。

e。ランクサンプルAとBを1対1で一致させます。

RにはこのためのStatsMatchという特別なパッケージがあることを私は知っています。しかし、それは私の要件を満たしていません。私が理解している限り、それはaeを実行し、中間のステップをスキップします。私はこのパッケージに関する初心者であり、このコミュニティの経験豊富なユーザーから学びたいと思っています。

4

2 に答える 2

4

私はsqldfパッケージを使用して質問に答えます。残念ながら、両方のデータセットで共有される各個人/行の一意の識別子がないと、これを行うことはできません。たとえば、各人/行が同じ年齢を共有していない場合、列Xを使用すると機能します。24歳の2人/行がある場合、この列は一意の識別子として機能できません。

一意の識別子を作成する方法を考えられるように、データに関する詳細情報を提供してください。

于 2012-10-11T14:35:16.537 に答える
2

提案された答え

データが提供されなかったので (しかしヒントが与えられた)、データフレームを生成し、それらのヒントAB基づいて (つまり、X->Age(Int); Y->Race(Factor); Z->?(Int)、おそらく人口?) . また、データフレーム A と B が R セッション ワークスペースに既に読み込まれていると仮定します。次に、アイテムが連続していないと仮定しますが、実際には( cd )によって生成されたサンプルに対して ( abe ) を実行したいと考えています。あれは:

  • ステップ 1 B の観測ごとに A の 10 個の観測を含め、 dataframe として保存しますmoreA
  • Setp 2 A の観測数が B と等しくなるように A の無作為標本を抽出し、名前を付けて保存しequalAます。
  • とのそれぞれを の9 つのセルにmoreA分割します。各セルは の合計を表し、範囲 (24, 60)を持ち、(41, 51) でカットされます。それぞれ、、として保存します。各セルは、またはの平均も「認識」しています。equalABrace x age_groupZage groupmoreAtableequalAtableBtableCrimeParticipation
  • の各セルをランク付けしmoreAtable、それが表す合計に従ってランク付けします。equalAtableBtableZ
  • ランクに基づいて と をそれぞれ照合し、それぞれ と moreAtableequalAtable保存します。BtablemoreABequalAB

このすべてについてnrow(A) >> nrow(B)、少なくとも の各行Aに対しての 10 行を取得するのに十分であると仮定しBます。

データセットを生成する

年齢 (24,61) と人種 (黒人、ヒスパニック、白人) は、それぞれのスペースから均一にサンプリングされます。パーセンテージは、おもちゃのベータ分布からサンプリングされ、[0, 100] の数値として表されます。その後、年齢は要求された範囲に分割されます。

# Reproducible sampling
set.seed(2013^2 * 3)

# Dataset B:
nrB <- 1000  # number of rows in B
B <- data.frame(X = sample(x = 24:60, size = nrB, replace = TRUE), Y = sample(x = c("Black", 
    "Hispanic", "White"), size = nrB, replace = TRUE), Z = sample(x = (1:300) * 
    1000, size = nrB, replace = TRUE), Crime = round(rbeta(n = nrB, shape1 = 0.5, 
    shape2 = 0.5) * 100, 2))

# Dataset B
nrA <- nrB * 20  # times of rows B = rows in A
A <- data.frame(X = sample(x = 24:60, size = nrA, replace = TRUE), Y = sample(x = c("Black", 
    "Hispanic", "White"), size = nrA, replace = TRUE), Z = sample(x = (1:300) * 
    1000, size = nrA, replace = TRUE), Participation = round(rbeta(n = nrB, 
    shape1 = 0.8, shape2 = 2) * 100, 2))

# Now lets cut the ages
B$AgeGroup <- cut(B$X, breaks = c(24, 41, 51, 60), labels = c("24-40", "41-50", 
    "51-60"), right = FALSE, include.lowest = TRUE)

A$AgeGroup <- cut(A$X, breaks = c(24, 41, 51, 60), labels = c("24-40", "41-50", 
    "51-60"), right = FALSE, include.lowest = TRUE)

# Show data
head(A)
##    X        Y      Z Participation AgeGroup
## 1 53    Black 167000         20.39    51-60
## 2 36    White 130000          3.10    24-40
## 3 57    White 101000         32.41    51-60
## 4 60    Black  28000         72.29    51-60
## 5 58    Black 172000         22.10    51-60
## 6 59 Hispanic  51000         69.01    51-60

head(B)
##    X        Y      Z Crime AgeGroup
## 1 58    White 118000  8.10    51-60
## 2 33    Black  97000 36.58    24-40
## 3 44 Hispanic 212000  3.62    41-50
## 4 29 Hispanic 108000 35.13    24-40
## 5 53    Black 175000 96.47    51-60
## 6 58    Black 291000  4.41    51-60
両方の A サンプル データセットを生成する

サンプル A データセットを取得しましょう。より長いものについては、B の各 on に対して 10 をサンプリングします。等しい長さの on については、A:B をサンプリングします。

# Longer A
moreA <- A[sample(x = 1:nrow(A), size = 10 * nrow(B)), ]

# Equal A
equalA <- A[sample(x = 1:nrow(A), size = nrow(B)), ]
データセットを 3x3 行列に分割します

実際には、データフレームを操作する方がはるかに簡単なので、3x3 マトリックスに分割しません。これには package を使用するplyrので、それがインストールされている (またはインストールできる) ことを確認してください。

# Try to load plyr. If not installed, try to install and then load it
if (!require("plyr")) {
    install.packages("plyr")
    library("plyr")
}

## Loading required package: plyr

# For each YxAgeGroup, sum Z and average the unique variable

Btable <- ddply(.data = B, .variables = c("Y", "AgeGroup"), .fun = function(x) {
    c(totalZ = sum(x$Z, na.rm = TRUE), meanCrime = mean(x$Crime, na.rm = TRUE))
})

moreAtable <- ddply(.data = moreA, .variables = c("Y", "AgeGroup"), .fun = function(x) {
    c(totalZ = sum(x$Z, na.rm = TRUE), meanParticipation = mean(x$Participation, 
        na.rm = TRUE))
})

equalAtable <- ddply(.data = equalA, .variables = c("Y", "AgeGroup"), .fun = function(x) {
    c(totalZ = sum(x$Z, na.rm = TRUE), meanParticipation = mean(x$Participation, 
        na.rm = TRUE))
})
テーブルをランク付けする

合計Zに従って各テーブルをランク付けします

Btable$rank <- rank(x = Btable$totalZ)
moreAtable$rank <- rank(x = moreAtable$totalZ)
equalAtable$rank <- rank(x = equalAtable$totalZ)
A テーブルのそれぞれを B とマージする

最後に、各 A テーブルを B とマージします

moreAB <- merge(Btable, moreAtable, by = "rank", suffixes = c("_B", "_A"))

equalAB <- merge(Btable, equalAtable, by = "rank", suffixes = c("_B", "_A"))

moreAB
##   rank      Y_B AgeGroup_B totalZ_B meanCrime      Y_A AgeGroup_A
## 1    1    White      51-60 12342000     53.41    Black      51-60
## 2    2    Black      41-50 13197000     51.11    White      51-60
## 3    3 Hispanic      41-50 13198000     50.44 Hispanic      41-50
## 4    4 Hispanic      51-60 13440000     50.70 Hispanic      51-60
## 5    5    White      41-50 14290000     51.70    White      41-50
## 6    6    Black      51-60 14526000     43.11    Black      41-50
## 7    7    White      24-40 21290000     50.46 Hispanic      24-40
## 8    8    Black      24-40 21607000     47.48    Black      24-40
## 9    9 Hispanic      24-40 23743000     50.17    White      24-40
##    totalZ_A meanParticipation
## 1 132935000             27.46
## 2 133766000             28.07
## 3 134911000             27.40
## 4 136962000             26.97
## 5 137234000             27.14
## 6 137315000             27.03
## 7 227174000             28.38
## 8 237046000             27.95
## 9 243853000             28.00

equalAB
##   rank      Y_B AgeGroup_B totalZ_B meanCrime      Y_A AgeGroup_A totalZ_A
## 1    1    White      51-60 12342000     53.41 Hispanic      41-50 10528000
## 2    2    Black      41-50 13197000     51.11    White      41-50 12770000
## 3    3 Hispanic      41-50 13198000     50.44    Black      51-60 13144000
## 4    4 Hispanic      51-60 13440000     50.70    White      51-60 14139000
## 5    5    White      41-50 14290000     51.70    Black      41-50 15029000
## 6    6    Black      51-60 14526000     43.11 Hispanic      51-60 16524000
## 7    7    White      24-40 21290000     50.46 Hispanic      24-40 19075000
## 8    8    Black      24-40 21607000     47.48    Black      24-40 21793000
## 9    9 Hispanic      24-40 23743000     50.17    White      24-40 25538000
##   meanParticipation
## 1             24.34
## 2             29.66
## 3             30.40
## 4             28.30
## 5             29.65
## 6             24.30
## 7             29.17
## 8             30.62
## 9             30.82

それは動作しますか?

于 2013-02-23T22:46:57.527 に答える