合并R中的两个数据库

时间:2012-10-11 13:43:28

标签: r matching

我有两个调查数据集,我想结合我的研究。示例数据如下所示:

**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 并跳过中间步骤。我是这个包的新手,想要向这个社区的有经验的用户学习。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

建议的答案

由于没有提供数据(但已被暗示),我将根据这些提示生成数据帧AB X-> Age(Int) ; Y-> Race(因子); Z->?(Int),可能是种群?)。另外,我假设您已经在R会话工作区中加载了数据帧A和B.然后我假设这些项目不是顺序的,但您实际上想要对( a b e )生成的样本执行( a b e ) em> c , d );那就是:

  • 第1步为B的每次观察包括10次A观察,保存为数据帧moreA
  • Setp 2 绘制A的随机样本,使A的观察数等于B,另存为equalA
  • moreAequalAB分别划分为race x age_group的9个单元格,每个单元格代表Z和{{1}的总和具有范围(24,60)并切入(41,51)。分别保存为age groupmoreAtableequalAtable。每个单元格也“知道”BtableCrime的平均值。
  • 根据Participation所代表的moreAtable的总和,对equalAtableBtableZ中的每个单元格进行排名。
  • 根据排名将moreAtableequalAtable分别与Btable匹配,并分别保存到moreABequalAB
  

对于所有这些,我将假设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

这有用吗?

相关问题