另一個基礎R溶液,但使用regexpr
:
df <- data.frame(
V1 = c("A", "B", "C", "D"),
V2 = c("XXYYYYY", "XXYYXX" , "XYXXYX", "XYYXYX")
)
提取match.length
的regexpr
輸出的屬性,然後計算每個a的長度ttribute(這告訴你有多少場比賽有):
r <- gregexpr("Y+", df$V2)
len <- lapply(r, FUN = function(x) as.array((attributes(x)[[1]])))
df$V3 <- lengths(len)
df$V4 <- len
df
#V1 V2 V3 V4
#1 A XXYYYYY 1 5
#2 B XXYYXX 1 2
#3 C XYXXYX 2 1, 1
#4 D XYYXYX 2 2, 1
,如果你有一箇舊的R版本不具有lengths
但你可以使用df$V3 <- sapply(len, length)
代替。 如果你需要一個更通用的功能,對任何向量x
和模式a
做同樣的:
foo <- function(x, a){
ans <- data.frame(x)
r <- gregexpr(a, x)
len <- lapply(r, FUN = function(z) as.array((attributes(z)[[1]])))
ans$quantity <- lengths(len)
ans$lengths <- len
ans
}
嘗試foo(df$V2, 'Y+')
。
我相信'str_'函數應該都是矢量化的。不需要「喂」它們。此外,'gregexpr(「Y」,df $ V2)'應該基本上給這個基地R. – thelatemail
謝謝,但你的解決方案給出'Y'的位置,而不是發生次數和/或長度 – user2904120
@thelatemail如果更改模式設置爲「Y +」,則匹配長度將被正確捕獲。 – steveb