如何使用dplyr的setdiff将数据分成两个集合

3
我正在使用dplyr将一些数据简单地分成训练集和测试集。
当我进行简单例子时,它非常有效:
a = c(1, 2, 3, 4, 5, 6, 7, 8)
b = c("A", "B", "C", "D", "E", "F", "G", "H")

df = data.frame(a, b)

train = sample_frac(df, 0.8)
test = setdiff(df, train)

> nrow(train) + nrow(test) == nrow(df)
[1] TRUE

然而,当我尝试使用经典的UCI Wine数据集进行相同操作时,似乎无法得到相同的结果:

wine = read.csv("http://www.nd.edu/~mclark19/learn/data/goodwine.csv")

wine_train = sample_frac(wine, 0.8)
wine_test = setdiff(wine, wine_train)

> nrow(wine_train) + nrow(wine_test) == nrow(wine)
[1] FALSE
> nrow(wine_train) + nrow(wine_test)
[1] 6105
> nrow(wine)
[1] 6497

我是否忽略了setdiff的某些行为?

谢谢, AG


难以追踪的错误,我同意! - Colonel Beauvel
1个回答

7
也许是因为有重复的行:
>any(duplicated(wine))
[1] TRUE

如果您清理数据集:

drunk = wine[!duplicated(wine),]
drunk_train = sample_frac(drunk, 0.8)
drunk_test = setdiff(drunk, drunk_train)
nrow(drunk_test) + nrow(drunk_train) == nrow(drunk)
[1] TRUE

啊,非常感谢,我没有想到要检查重复项——谢谢! - dreww2
不幸的是,我可以亲身证明上校的答案是正确的。我花了好几个小时才找到它! - meh
我很欣赏新的 df 名称 - 将数据与现实世界联系起来哈哈 - dwanderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接