首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算模式并区分它们

计算模式并区分它们
EN

Stack Overflow用户
提问于 2016-01-17 23:20:09
回答 3查看 128关注 0票数 3

我想在字符串中为dataframe的每一行计算一个定义的模式(在这里:'Y')。理想情况下,我希望在V3中得到一些事件,在V4中得到一些长度。

输入:

代码语言:javascript
复制
V1  V2
A   XXYYYYY
B   XXYYXX
C   XYXXYX
D   XYYXYX

输出:

代码语言:javascript
复制
V1       V2 V3   V4
 A  XXYYYYY  1    5
 B   XXYYXX  1    2
 C   XYXXYX  2  1,1
 D   XYYXYX  2  2,1

我试着对下面的功能做了不同的修改,但没有成功。

代码语言:javascript
复制
dict <- setNames(nm=c("Y"))
seqs <- df$V2
sapply(dict, str_count, string=seqs)

提前感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-17 23:54:00

下面是一个stringr解决方案:

代码语言:javascript
复制
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 = ",")
  })
票数 1
EN

Stack Overflow用户

发布于 2016-01-18 00:42:30

另一个基本R解决方案,但使用regexpr

代码语言:javascript
复制
df <- data.frame(
  V1 = c("A", "B", "C", "D"),
  V2 = c("XXYYYYY", "XXYYXX" , "XYXXYX", "XYYXYX")
)

提取match.length输出的regexpr属性,然后计数每个属性的长度(这将告诉您有多少匹配):

代码语言:javascript
复制
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执行同样的操作

代码语言:javascript
复制
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+')

票数 2
EN

Stack Overflow用户

发布于 2016-01-18 00:10:16

在基数R中:

代码语言:javascript
复制
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 = ","))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34845000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档