R数据帧中的部分匹配

时间:2013-05-03 17:04:52

标签: r match partial

如何处理数据框中的部分匹配? 让我们说这是我的df  DF

   V1  V2  V3 V4
1 ABC 1.2 4.3  A
2 CFS 2.3 1.7  A
3 dgf 1.3 4.4  A

并且我想添加一个包含数字111的列V5,只有当V1中的值在名称中包含“f”时才会添加,而只有当V1中的值包含“gf”时才能添加数字222。我会遇到问题,因为有几个值包含“f” - 或者我按照命令执行的命令会处理它吗?

我尝试过类似的事情:

df$V5<- ifelse(df$V1 = c("*f","*gf"),c=(111,222) )

但它不起作用。

主要问题是如何告诉R寻找“部分匹配”?

万分感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

除了解决方案设置"f", "gf", ...序列中的值之外,值得看一下零宽度前瞻/后瞻的正则表达式功能。

如果您要grep包含"f"但不包含"gf"的所有行,您可以

v1 <- c("abc", "f", "gf" )
grep( "(?<![g])f" , v1, perl= TRUE )
[1] 2

如果您只想grep那些包含"f"但不包含"fg"的文件

v2 <- c("abc", "f", "fg")
grep( "f(?![g])" , v2, perl= TRUE )
[1] 2

当然你可以混合使用:

v3 <- c("abc", "f", "fg", "gf")
grep( "(?<![g])f(?![g])" , v3, perl= TRUE )
[1] 2

因此,对于您的情况,您可以

df[ grep( "(?<![g])f" , df$V1, perl= TRUE ), "V5" ] <- 111
df[ grep( "gf" , df$V1, perl= TRUE ), "V5" ] <- 222

答案 1 :(得分:0)

 df$V5 <- NA
 df$V5[grep("f", df$V1)] <- 111
 df$V5[grep("gf", df$V1)] <- 222  # obviously some of the "f" values could be overwritten.

有一个switch函数,我太过密集而无法理解,在我看来它似乎应该像Pascal case一样。我可以使用一些奇怪的布尔值来进行数字索引操作,但这可能不太有用。