我有一个字符串Age
,其中包含各种主题的年龄:
"1 Months8 Days" "1 Years" "10 Days" "10 Months" "10 Months1 Days"
现在,我希望它转换为单个数字,等于年龄。 什么是最好的方法呢?
我尝试使用:
regmatches(years, gregexpr("[[:digit:]]+", years))
但这并没有区分数月和数年。该向量不具有除上述之外的任何其他格式的字符串。怎么办呢?
答案 0 :(得分:4)
这是使用gsub
的更复杂的方式。我在匹配日期时出现问题@BhargavRao,@Cath and @Tensibai已将其修复为聊天内容。
x <- c("1 Months8 Days", "1 Years", "10 Days", "10 Months", "10 Months1 Days", "1 Months")
xy <- data.frame(
original = x,
years = as.numeric(sapply(strsplit(x, split = "Years"), FUN = function(m) gsub("\\d+$", "\\1", m))),
months = as.numeric(sapply(strsplit(x, split = "Months"), FUN = function(m) gsub("\\d+$", "\\1", m)[1])),
days = as.numeric(sapply(strsplit(x, split = "Days"), FUN = function(m) gsub("(.*?)(\\d\\d?)(\\s)$", "\\2", m)))
)
xy$result <- apply(xy[-1], MARGIN = 1, FUN = function(m) sum(m["years"], m["months"]/12, m["days"]/365, na.rm = TRUE))
xy
original years months days result
1 1 Months8 Days NA 1 8 0.10525114
2 1 Years 1 NA NA 1.00000000
3 10 Days NA NA 10 0.02739726
4 10 Months NA 10 NA 0.83333333
5 10 Months1 Days NA 10 1 0.83607306
6 1 Months NA 1 NA 0.08333333
答案 1 :(得分:4)
这是一个可能的解决方案:
$(".slidermenudown .fa-angle-down").on("click",function(){
var parentli = $(this).parents('li').attr("id");
var thisBox = $("#"+parentli).children().find(".anthr_usr_cmnt");
if(thisBox.hasClass("active")){
thisBox.removeClass("active");
}else{
$(".anthr_usr_cmnt.active").removeClass("active");
thisBox.addClass("active");
}
});
答案 2 :(得分:3)
我们可以使用gsubfn
library(gsubfn)
v2 <- gsubfn("[A-Za-z]+", list(Years = "* 1", Months = "* 1/12", Days = "* 1/365"),
sub("(?<=[A-Za-z])(?=[0-9])", " + ", v1, perl=TRUE))
unname(sapply(v2, function(x) eval(parse(text=x))))
#[1] 0.10525114 1.00000000 0.02739726 0.83333333 0.83607306
v1 <- c("1 Months8 Days", "1 Years", "10 Days", "10 Months", "10 Months1 Days")
答案 3 :(得分:0)
这适用于给定格式
> age<- c("1 Months8 Days", "1 Years", "10 Days", "10 Months", "10 Months1 Days")
> t <- regmatches(age, gregexpr("[[:digit:]]+", age))
> c_m <- regexpr("Months" , age) > 0
> c_d <- regexpr("Days" , age) > 0
> i <- 1
> age_in_years <- sapply(t , function(x ){
+ if(length(x) >1){
+ a <- as.numeric(x[1])/12 + as.numeric(x[2]) / 360 }
+ else{
+ if(c_m[i]){
+ a <- as.numeric(x) / 12}
+ else if (c_d[i]){
+ a <- as.numeric(x)/360}
+ else{a<- as.numeric(x)} }
+ i <<- i +1
+ a})
> age_in_years
[1] 0.10555556 1.00000000 0.02777778 0.83333333 0.83611111