我正在研究一些参考/匹配逻辑,并且想知道是否有人知道如何解决这个问题。我在excel中创建了这样一个工具,在pi中创建了一个有限的工具,但是使用r代替它会很好,所以我可以将它绑定到我拥有的其他一些函数中。
有一个包含三列的数据框:' table_name',' columnfriendlyname'和' iskey'。 在' columnfriendlyname'包括常规字段名称的标签,外键的名称和主键的名称。
该表应该(希望如此)是使用数据库标签(在columnfriendlyname中找到)的命名法将标记附加到iskey中。
逻辑是:
我在这里根据这个问题中的逻辑创建了一个条件插入:R conditional lapply?
到目前为止它对主键很有用:
prime<- (dict_data_raw$columnfriendlyname==dict_data_raw$table_name)==TRUE
dict_data_raw$iskey[prime] <-"Primary_key"
但是现在我需要弄清楚== table_name,但是!= table_name在行中。
编辑:如果有助于澄清以下数据的示例:
table_name columnfriendlyname is_key
1 address address primary_key
2 address entity foreign_key
3 address zip non_key
4 matter matter primary_key
5 matter address foreign_key
6 matter mattertype non_key
7 entity entity primary_key
8 entity address foreign_key
9 entity dob non_key
感谢您的帮助!
答案 0 :(得分:2)
你可以使用像这样使用ifelse
的循环:
for (x in 1:nrow(dict_data_raw)){
dict_data_raw$iskey[x] <- ifelse(dict_data_raw$columnfriendlyname[x] == dict_data_raw$table_name[x], "primary_key", ifelse(dict_data_raw$columnfriendlyname[x] %in% dict_data_raw$table_name, "foreign_key", "non_key"))
}
如果columnfriendlyname的值等于table_name,则检查第一个ifelse,如果是,则写入“primary_key”,如果不是,则检查第二个ifelse是否在columnfriendlyname中的值是否在table_name中的所有值。如果是,则写入“foreign_key”,如果不是,则写入“non_key”。
ifelse
检查条件是真还是假,并根据该值给出一个值或另一个值。第二个ifelse
可以嵌套在false值上以解决您的问题。
希望它有所帮助!
答案 1 :(得分:1)
以下代码解决了您的问题
u <- unique(dict_data_raw$table_name) # simplifying the table names set
dict_data_raw$is_key <-
ifelse(
dict_data_raw$columnfriendlyname==dict_data_raw$table_name,
"primary_key",
ifelse(
dict_data_raw$columnfriendlyname %in% u,
"foreign_key",
"non_key"
)
)
因为 ifelse()是一个向量化函数,它采用 n - 长度向量,一个逻辑向量,并构造一个 n - 长度向量取第2个或第3个参数的值,取决于第一个参数的每个值(TRUE或FALSE)。
使用进行循环时,最好使用 if 构造而不是 ifelse()功能,在这种情况下正确的代码应该是
u <- unique(dict_data_raw$table_name) # simplifying the table names set
for (i in 1:nrow(dict_data_raw)) {
dict_data_raw$is_key[i] <-
if(dict_data_raw$columnfriendlyname[i]==dict_data_raw$table_name[i]) {
"primary_key"
} else
if (dict_data_raw$columnfriendlyname[i] %in% u) {
"foreign_key"
} else "non_key"
}
另一种方法是使用 apply()功能:
u <- unique(dict_data_raw$table_name) # simplifying the table names set
dict_data_raw$is_key <-
apply(dict_data_raw, 1, function(rrow) if (rrow[1]==rrow[2]) "primary_key" else if(rrow[2] %in% u) "foreign_key" else "non_key")