我想为数据帧的每一行计算字符串中定义的模式(此处为“Y”)。理想情况下,我希望获得 V3 中的出现次数和 V4 中的长度。
输入:
V1 V2
A XXYYYYY
B XXYYXX
C XYXXYX
D XYYXYX
输出:
V1 V2 V3 V4
A XXYYYYY 1 5
B XXYYXX 1 2
C XYXXYX 2 1,1
D XYYXYX 2 2,1
我尝试对下面的函数进行不同的修改,但没有成功。
dict <- setNames(nm=c("Y"))
seqs <- df$V2
sapply(dict, str_count, string=seqs)
提前致谢!
最佳答案
另一个基础 R 解决方案,但使用 regexpr
:
df <- data.frame(
V1 = c("A", "B", "C", "D"),
V2 = c("XXYYYYY", "XXYYXX" , "XYXXYX", "XYYXYX")
)
摘录match.length
regexpr
的属性输出,然后计算每个属性的长度(它告诉你有多少匹配项):
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+')
.
关于r - 计算模式并区分它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34845000/