如何处理数据框中的部分匹配? 让我们说这是我的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寻找“部分匹配”?
万分感谢你的帮助!
答案 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
一样。我可以使用一些奇怪的布尔值来进行数字索引操作,但这可能不太有用。