find:匹配列,而不是行

时间:2017-04-25 21:02:29

标签: r

我正在研究一些参考/匹配逻辑,并且想知道是否有人知道如何解决这个问题。我在excel中创建了这样一个工具,在pi中创建了一个有限的工具,但是使用r代替它会很好,所以我可以将它绑定到我拥有的其他一些函数中。

有一个包含三列的数据框:' table_name',' columnfriendlyname'和' iskey'。 在' columnfriendlyname'包括常规字段名称的标签,外键的名称和主键的名称。

该表应该(希望如此)是使用数据库标签(在columnfriendlyname中找到)的命名法将标记附加到iskey中。

逻辑是:

  • 如果在行中,columnfriendlyname = table_name,则:is_key < - " primary_key"
  • 如果行,columnfriendlyname = table_name,则:is_key < - " foreign_key"
  • 如果所有columnfriendlyname都没有匹配!= table_name,那么:is_key< - " non_key"

我在这里根据这个问题中的逻辑创建了一个条件插入: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

感谢您的帮助!

2 个答案:

答案 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)

使用ifelse()

以下代码解决了您的问题

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()

另一种方法是使用 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")