2

如何解决数据框中的部分匹配问题?可以说这是我的 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 寻找“部分匹配”?

感谢一百万您的帮助!

4

2 回答 2

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
于 2013-05-03T17:38:26.703 回答
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。我可以通过一些奇怪的布尔到数字索引操作来做到这一点,但这不太可能有帮助。

于 2013-05-03T17:11:53.680 回答