我有两个调查数据集,我想结合我的研究。示例数据如下所示:
**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对每个单元格进行排名。
℃。对于B的每次观察,包括10次A观察。
d。绘制A的随机样本,使A的观测数等于B.
即匹配等级样本A和B一对一。
我知道R有一个名为StatsMatch的特殊包。但是,它不符合我的要求。据我了解,它确实 a 和 e 并跳过中间步骤。我是这个包的新手,想要向这个社区的有经验的用户学习。
答案 0 :(得分:4)
我会使用sqldf包来回答问题a-c。遗憾的是,如果没有两个数据集共享的每个人/行的唯一标识符,我就无法做到这一点。例如,如果每个人/每行不共享相同年龄,则使用列X将起作用。如果您有两个24岁的人/行,则此列不能作为唯一标识符。
请提供有关您的数据的更多信息,然后我们可以考虑创建唯一标识符的方法。
答案 1 :(得分:2)
由于没有提供数据(但已被暗示),我将根据这些提示生成数据帧A
和B
(即 X-> Age(Int) ; Y-> Race(因子); Z->?(Int),可能是种群?)。另外,我假设您已经在R会话工作区中加载了数据帧A和B.然后我假设这些项目不是顺序的,但您实际上想要对( a , b , e )生成的样本执行( a , b , e ) em> c , d );那就是:
moreA
。equalA
。moreA
,equalA
和B
分别划分为race x age_group
的9个单元格,每个单元格代表Z
和{{1}的总和具有范围(24,60)并切入(41,51)。分别保存为age group
,moreAtable
和equalAtable
。每个单元格也“知道”Btable
或Crime
的平均值。Participation
所代表的moreAtable
的总和,对equalAtable
,Btable
和Z
中的每个单元格进行排名。moreAtable
和equalAtable
分别与Btable
匹配,并分别保存到moreAB
和equalAB
。生成数据集对于所有这些,我将假设
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数据集。对于较长的一个,我们在B中为每个开始采样10个。对于相等的长度,我们采样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矩阵,因为使用数据帧要容易得多。为此,我将使用包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
这有用吗?