gpt4 book ai didi

r - 如何防止索引/键重复的行附加到data.frame?

转载 作者:行者123 更新时间:2023-12-04 03:19:43 34 4
gpt4 key购买 nike

我有两个变量(“ManufactererId”和“ProductId”)的组合构成唯一键/标识符的数据。数据如下所示:

my.data <- data.frame(ManufactererId = c(1, 1, 2, 2),
ProductId = c(1, 2, 1, 7),
Price = c(12.99, 149.00, 0.99, 3.99))
my.data
# ManufactererId ProductId Price
# 1 1 1 12.99
# 2 1 2 149.00
# 3 2 1 0.99
# 4 2 7 3.99

我想确保我不会意外添加另一对行,其中ManufactererId-ProductId对等于表中已经存在的行(例如数据库表上的唯一约束)。

也就是说,如果我尝试将ManufactererId = 2和ProductId = 7的行添加到我的数据框中:
my.data <- rbind(my.data, data.frame(ManufactererId = 2, ProductId = 7, Price = 120.00))

...它应该会因错误而失败。如何做到这一点?

还是应该使用其他数据类型?

最佳答案

1)动物园是否方便取决于您要执行的操作,但是动物园对象具有唯一索引。我们可以通过将两个Id列粘贴在一起来构造文本索引。

library(zoo)
z <- with(my.data, zoo(Price, paste(ManufactererId, ProductId)))

z <- c(z, zoo(90, "1 1")) # Error, not appended
z <- c(z, zoo(90, "1 3")) # OK

请注意,动物园对象的数据部分可以是如上所示的向量,也可以是矩阵,以防数据中包含的不仅仅是价格。

2)SQLite 可以使用许多数据库中的任何一个来完成,但是我们将在此处使用SQLite。首先,我们在SQLite数据库中创建一个具有唯一索引的表,然后插入行。
library(RSQLite)

con <- dbConnect(SQLite())
dbWriteTable(con, "my", my.data, row.names = FALSE)
dbGetQuery(con, "create unique index ix on my(ManufactererId, ProductId)")

dbGetQuery(con, sprintf("insert into my values(%d, %d, %d)", 1, 1, 99)) # error
dbGetQuery(con, sprintf("insert into my values(%d, %d, %d)", 1, 13, 90)) # OK

关于r - 如何防止索引/键重复的行附加到data.frame?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36112817/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com