匹配r

时间:2018-10-31 21:52:54

标签: r dplyr

我是R语言编码的新手,在查找同一列中的两个名称时遇到麻烦。

更具体地说,我有一个包含行的表格,其中有一个名为“ fileName”的列,该列给出了不同颜色的名称。该表是由两个不同的表组合而成的,因此第一个表的颜色名称称为new_red,第二个表的颜色名称称为old_red。

我希望能够创建一个新列,该列表示如果字符集在fileName列中多次匹配,则在新列中为颜色所在的行写“匹配”。 new_是一种唯一的颜色,在没有old_的情况下,该颜色将写入“ No_new_match”,而对于旧颜色,它将写入“ No_old_match”。

我相信有一行代码会在名称后引用一定数量的数字/字符,即它将为new_xxx查找3个字符。我曾尝试像“ new \ d {3}”那样进行操作,但没有达到我的预期效果。

这里是我所指的例子

文件名

  1. new_red
  2. 新蓝
  3. new_green
  4. old_red
  5. old_purple

  1. 匹配
  2. 没有新的比赛
  3. 没有新的比赛
  4. 匹配
  5. 无旧匹配

    我们将不胜感激,我为如何创建新表创建了新的列,例如表格,但是我在此部分遇到了麻烦。再次感谢您!

2 个答案:

答案 0 :(得分:1)

这是使用正则表达式的一种方式:

fileName <- c("new_red", "new_blue", "new_green", "old_red", "old_purple")
color <- gsub("(new_)|(old_)", "", fileName)
color.freq <- table(color)

df <- data.frame(
  fileName = fileName,
  color = color,
  match = ifelse(
    color.freq[color] == 2,
    "Match",
    ifelse(
      grepl("new", fileName),
      "No_new_match",
      "No_old_match"
    )
  )
)

    fileName  color        match
1    new_red    red        Match
2   new_blue   blue No_new_match
3  new_green  green No_new_match
4    old_red    red        Match
5 old_purple purple No_old_match

答案 1 :(得分:0)

这里是dplyr的一种方式-

df <- data.frame(fileName = c("new_red", "new_blue", "new_green", "old_red", "old_purple"),
                 stringsAsFactors = F)

df %>%
  mutate(
    Match = sapply(strsplit(fileName, "_"), "[", 2),
    Match = duplicated(Match) | duplicated(Match, fromLast = T)
  )

    fileName Match
1    new_red  TRUE
2   new_blue FALSE
3  new_green FALSE
4    old_red  TRUE
5 old_purple FALSE

您可以根据需要对Match列进行外观更改。