我有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
也许我今天早上已经死了,但是我一直在检查合并,哪个匹配,但是我还没有完全找到它。
答案 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