我想在数据帧的每一行的字符串中计算一个已定义的模式(此处为:' 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)
提前致谢!
答案 0 :(得分:2)
另一个基础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+')
。
答案 1 :(得分:1)
以下是stringr
解决方案:
df <- data.frame(
V1 = c("A", "B", "C", "D"),
V2 = c("XXYYYYY", "XXYYXX" , "XYXXYX", "XYYXYX")
)
df$V3 <- str_count(df$V2, "Y+")
df$V4 <- lapply(str_locate_all(df$V2, "Y+"), function(x) {
paste(x[, 2] - x[, 1] + 1, collapse = ",")
})
答案 2 :(得分:1)
在基地R:
aaa <- data.frame(V1 = LETTERS[1:4],
V2 = c("XXYYYYY", "XXYYXX", "XYXXYX", "XYYXYX"),
stringsAsFactors = FALSE)
# split into strings of "Y"s
splt <- lapply(aaa$V2, function(x) unlist(strsplit(x, "[^Y]+"))[-1])
# number of occurrences
aaa$V3 <- lapply(splt, length)
# length of each occurence
aaa$V4 <- lapply(splt, function(x) paste(nchar(x), collapse = ","))