R遍历列并仅保留包含'&'的行或'和'

时间:2015-06-23 19:29:28

标签: r

我有一个包含多列的数据框。 A列包含重复的数字。 B列包含名字。我想搜索所有行,并且对于列A的相等值,只保留具有'&'的行符号或列B中的单词'和'。如果没有条目具有这些值中的任何一个,那么我只想保留任何1行与哪一行无关。样本数据:

Column A           Column B     
12345                John
12345                Mary and Bob
12345                Ben
44444                Jim
44444                Larry & Meg
55555                Tommy

预期产出:

Column A            Column B
12345               Mary and Bob
44444               Larry & Meg
55555               Tommy

3 个答案:

答案 0 :(得分:3)

您可以使用avegrepl获取匹配的行:

dat[ave(dat$ColumnB, dat$ColumnA, FUN=function(x) {
  g <- grepl("( & )|( and )", x)
  if (all(!g)) {
    seq_along(x) == 1
  } else {
    g
  }
}) == "TRUE",]
#   ColumnA      ColumnB
# 2   12345 Mary and Bob
# 5   44444  Larry & Meg
# 6   55555        Tommy

数据:

dat = data.frame(ColumnA=c(12345, 12345, 12345, 44444, 44444, 55555), ColumnB=c("John", "Mary and Bob", "Ben", "Jim", "Larry & Meg", "Tommy"), stringsAsFactors=FALSE)

答案 1 :(得分:2)

尝试

library(data.table)
setDT(df1)[ , {tmp <- grepl('\\band\\b|&', ColumnB)
               .SD[tmp|all(!tmp)]}, ColumnA]
#   ColumnA      ColumnB
#1:   12345 Mary and Bob
#2:   44444  Larry & Meg
#3:   55555        Tommy

或使用dplyr

library(dplyr)
df1 %>% 
   group_by(ColumnA) %>% 
   mutate(tmp= grepl('\\band\\b|&', ColumnB)) %>% 
   filter(tmp|all(!tmp))%>%
   select(-tmp)

#  ColumnA      ColumnB
#1   12345 Mary and Bob
#2   44444  Larry & Meg
#3   55555        Tommy

数据

df1 <- structure(list(ColumnA = c(12345L, 12345L, 12345L, 44444L, 44444L, 
55555L), ColumnB = c("John", "Mary and Bob", "Ben", "Jim", "Larry & Meg", 
"Tommy")), .Names = c("ColumnA", "ColumnB"), class = "data.frame",
row.names = c(NA, -6L))

答案 2 :(得分:0)

您希望将数据集拆分为成对和单身,对ID进行重复数据删除,然后返回所有没有情侣的情侣和单身。

 @"\\host\path\filename.any"
 // or 
"\\\\host\\path\\filename.any"