-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 的唯一变量是犯罪。这是我想做的事情:

一个。将每个数据集划分为 9 个单元格,如下所示:

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

湾。根据变量 Z 对每个单元格进行排名。

C。对于 B 的每个观察,包括 10 个 A 的观察。

d。抽取 A 的随机样本,使 A 的观察次数等于 B。

e. 将排名样本 A 和 B 一对一匹配。

我知道 R 对此有一个名为 StatsMatch 的特殊包。但是,它不符合我的要求。据我了解,它执行ae并跳过中间步骤。我是这个包的新手,想向这个社区的有经验的用户学习。

4

2 回答 2

4

我会使用 sqldf 包来回答问题 ac。不幸的是,如果没有两个数据集共享的每个人/行的唯一标识符,我就无法做到这一点。例如,如果每个人/行的年龄不同,则使用 X 列将起作用。如果您有两个 24 岁的人/行,则此列不能用作唯一标识符。

请提供有关您的数据的更多信息,然后我们可以考虑创建唯一标识符的方法。

于 2012-10-11T14:35:16.537 回答
2

建议的答案

由于没有提供数据(但被暗示),我将生成数据帧AB基于这些提示(X->Age(Int); Y->Race(Factor); Z->?(Int),也许是人口?) . 另外,我假设您已经在 R 会话工作区中加载了数据框 A 和 B。然后我假设这些项目不是连续的,但你实际上想要对( c , d )生成的样本执行 ( a , b , e ); 那是:

  • 第 1 步为 B 的每个观测值包括 10 个 A 观测值,另存为 dataframe moreA
  • Setp 2抽取 A 的随机样本,使 A 的观察次数等于 B,另存为equalA.
  • moreA将,equalA和中的每一个划分为 的B9 个单元格race x age_group,每个单元格代表范围 (24, 60) 和切入 (41, 51) 的Z总和age group。另存为moreAtable,equalAtableBtable, 分别。每个单元格还“知道”Crime或的平均值Participation
  • 对 中的每个单元格进行排名moreAtableequalAtable并根据它所代表Btable的总和。Z
  • 根据排名将 moreAtableequalAtable与匹配,并分别保存到和。BtablemoreABequalAB

对于这一切,我将假设nrow(A) >> nrow(B),至少足以A为每行获得 10 行B.

生成数据集

年龄(24,61)和种族(黑人,西班牙裔,白人)从它们的空间中统一采样。百分比是从玩具 beta 分布中抽取的,并表示为 [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 回答