合并2个data.frames,但在比较多个字段时跳过/删除行

时间:2014-05-26 15:26:28

标签: r merge dataframe match

我有2个数据框 - 第一个是我的实际数据,可归结为东西的长度和重量,按年龄,大小和性别分类。

data <- "   AGE SIZE SEX LEN  WT
0   6.5     0    3   11
0   8.5     0    9   53
0  10.5     0    7   67
0   8.5     1    1    8"

data <- read.table(text=data, header=TRUE)

对于我的分析,我需要添加年龄,大小和性别的所有可能组合,并将值0分配给len和wt。我已经生成了包含所有这些可能值的第二个data.frame。例如,它的一个子集如下所示:

#ages are "0", but they can range from 0 to ~20
#for any "SIZE", sex can be 0-2
filler <- "   AGE SIZE SEX LEN  WT
0   6.5     0    0    0
0   6.5     1    0    0
0   6.5     2    0    0
0   8.5     0    0    0
0   8.5     1    0    0
0   8.5     2    0    0
0  10.5     0    0    0
0  10.5     1    0    0
0  10.5     2    0    0"
filler <- read.table(text=filler, header=TRUE)

我正在尝试将这两个数据框合并在一起,将默认的填充值替换为存在的实际数据,但保留填充数据,而不存在真实数据。

基本上,如果我的数据具有相同的年龄,性别和大小组合,那么我的填充数据中的相应行应该被丢弃(即用实际数据替换)。我想要的输出如下所示。

AGE SIZE SEX LEN  WT
0   6.5     0    3   11  #data
0   6.5     1    0    0
0   6.5     2    0    0
0   8.5     0    9   53  #data
0   8.5     1    1    8  #data
0   8.5     2    0    0
0  10.5     0    0    0
0  10.5     0    7   67  #data
0  10.5     2    0    0

也许我今天早上已经死了,但是我一直在检查合并,哪个匹配,但是我还没有完全找到它。

1 个答案:

答案 0 :(得分:2)

使用expand.grid创建filler数据框,但仅包含因子级别。

filler <- expand.grid(AGE=0:2, SIZE=seq(6.5, 10.5, by=2), SEX=0:2)
head(filler)
  AGE SIZE SEX
1   0  6.5   0
2   1  6.5   0
3   2  6.5   0
4   0  8.5   0
5   1  8.5   0
6   2  8.5   0

然后使用merge执行右连接,即设置all.y=TRUE

z <- merge(data, filler, all.y=TRUE)
head(z)

  AGE SIZE SEX LEN WT
1   0  6.5   0   3 11
2   0  6.5   1  NA NA
3   0  6.5   2  NA NA
4   0  8.5   0   9 53
5   0  8.5   1   1  8
6   0  8.5   2  NA NA

最后,您可以将NA值替换为0.以下是执行此操作的方法之一:

z[is.na(z)] <- 0
head(z)

  AGE SIZE SEX LEN WT
1   0  6.5   0   3 11
2   0  6.5   1   0  0
3   0  6.5   2   0  0
4   0  8.5   0   9 53
5   0  8.5   1   1  8
6   0  8.5   2   0  0