我想在字符串中为dataframe的每一行计算一个定义的模式(在这里:'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)提前感谢!
发布于 2016-01-17 23:54:00
下面是一个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 = ",")
})发布于 2016-01-18 00:42:30
另一个基本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如果您有一个没有lengths的旧版本的R,那么您可以使用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+')。
发布于 2016-01-18 00:10:16
在基数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 = ","))https://stackoverflow.com/questions/34845000
复制相似问题