在记录中多次搜索

时间:2016-05-11 08:32:39

标签: r

我在数据集示例中有一个可变代码

code
asdas%4shdgjas%4hj%4
asdsadsad
fgfd%4akk

我想以这样的方式处理:当它在变量中找到%4时,它应该将%4的位置分配给变量pos(例如,在第一个记录中,它来自6)。之后需要创建另一个变量val,以便它应该从pos。

的值中对变量代码进行子串

1 个答案:

答案 0 :(得分:1)

你可以做到

df <- data.frame(code=c("asdas%4shdgjas%4hj%4", "asdsadsad", "fgfd%4akk"), stringsAsFactors = FALSE)
df$pos <- sapply(gregexpr("%4", df$code, fixed = TRUE), "[", 1)
df$val <- with(df, substr(code, pos, nchar(code)))
df
#                   code pos             val
# 1 asdas%4shdgjas%4hj%4   6 %4shdgjas%4hj%4
# 2            asdsadsad  -1       asdsadsad
# 3            fgfd%4akk   5           %4akk

这是多个匹配的替代方案,可能需要install.packages("tidyr")之前:

df <- data.frame(code=c("asdas%4shdgjas%4hj%4", "asdsadsad", "fgfd%4akk"), stringsAsFactors = FALSE)
df$pos <- gregexpr("%4", df$code, fixed = TRUE)
df <- tidyr::unnest(df)
df$val <- with(df, substr(code, pos, nchar(code)))
df
# Source: local data frame [5 x 3]
# 
#                   code   pos             val
#                  (chr) (int)           (chr)
# 1 asdas%4shdgjas%4hj%4     6 %4shdgjas%4hj%4
# 2 asdas%4shdgjas%4hj%4    15          %4hj%4
# 3 asdas%4shdgjas%4hj%4    19              %4
# 4            asdsadsad    -1       asdsadsad
# 5            fgfd%4akk     5           %4akk