R比较,合并,匹配数据帧

时间:2016-04-18 15:15:20

标签: r dataframe merge

我有两个数据帧。一个是包含我需要的所有行的模板。我需要运动和模特的所有组合。另一个是我收到的输出,其中包含一些无关的行并且缺少其他行。如何合并它们以便输出数据框包含所有匹配的行(在输出中删除不必要的行并从模板中获取其他需要的行)。我希望最终的数据帧具有输出的平均值和数量,除了那些不存在的行,在这种情况下它们应该是NA。

模板

          date  gender licen checked    sport  model average amount
1  3/21/16     Man  CERT       1 baseball model1      NA     NA
2  3/21/16     Man  CERT       1   soccer model1      NA     NA
3  3/21/16     Man  CERT       1 football model1      NA     NA
4  3/21/16   Woman  CERT       1 baseball model2      NA     NA
5  3/21/16     Man  CERT       1   soccer model2      NA     NA
6  3/21/16     Man  CERT       1 football model2      NA     NA
7  3/21/16   Woman    NO       1 baseball model3      NA     NA
8  3/21/16 Unknown    NO       1   soccer model3      NA     NA
9  3/21/16 Unknown    NO       1 football model3      NA     NA
10 3/21/16   Woman    NO       1 baseball model4      NA     NA
11 3/21/16   Woman    NO       1   soccer model4      NA     NA
12 3/21/16   Woman    NO       1 football model4      NA     NA

输出:

      date  gender licen checked    sport  model average amount
1  3/21/16     Man  CERT       1 baseball model1     1.2     12
2  3/21/16     Man  CERT       1   soccer model1     4.1     56
3  3/21/16   Woman  CERT       1  walking model2     6.5     33
4  3/21/16     Man  CERT       1   soccer model2     2.4     91
5  3/21/16     Man  CERT       1 football model2     1.1     14
6  3/21/16   Woman    NO       1 baseball model3     3.7     56
7  3/21/16 Unknown    NO       1  running model3     6.1     29
8  3/21/16 Unknown    NO       1 football model3     1.0     17
9  3/21/16   Woman    NO       1 baseball model4     1.6     56
10 3/21/16   Woman    NO       1 football model4     2.7     32

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

将您的数据复制粘贴到read.table功能:

a <- read.table("clipboard", header = T) #Template
b <- read.table("clipboard", header = T) #Output

您可以使用merge功能,但需要唯一标识符。使用interaction构建一个。 Paste也适用于此。

a$id <- interaction(a$sport, a$model)
b$id <- interaction(b$sport, b$model)

合并数据,并在模板df中添加所有不匹配的案例。

merge(a, b, by="id", all.x = T)

答案 1 :(得分:1)

这可能有效,假设运动模型组合在模板中是唯一的:

instance = form.save(commit=False)
if request.user.is_authenticated():
    instance.user = request.user
instance.save()