用多个字符串替换相同的事件

时间:2020-08-04 12:14:09

标签: vector replace

假设我有一个包含多个字符串的向量:

// Common function to get first day for any month & year.
public DateTime GetFirstDayOfMonth(int year, int month, int day)
{        
    return new DateTime(year, month, 1)
           .AddDays((7 - datetime.DayOfWeek.GetHashCode() + day) % 7);
}
public DateTime GetFirstMonday(int year, int month = 1)
{        
    return GetFirstDayOfMonth(year, month, DayOfWeek.Monday.GetHashCode());
}

如何替换第一个“?” b用第二个“?”用c和第三个“?”通过d,以产生如下结果:

a<- c('a?cd','ab?cd','abc?')

用G. Grothendieck的答案改善话题!

如果同一元素中有两个符号应替换为不同的模式:

'abcd','abcd','abcd'

3 个答案:

答案 0 :(得分:3)

如下所示,在每个组件上应用chartr。请注意,head(...)c("b", "c", "d")。不使用任何软件包。

a<- c('a?cd','ab?cd','abc?') # test input
mapply(chartr, "?", head(letters[-1], length(a)), a, USE.NAMES = FALSE)
## [1] "abcd"  "abccd" "abcd" 

如果您要检查的是每个组件中是否缺少“ a”,“ b”,“ c”,“ d”元素,请替换?缺少该元素的元素,然后首先创建L个替换的列表,然后将sub应用于每个带有它的组件。我们假设每个组件中有0或1个缺少的元素,以及?的0或1个实例。在每个组件中。同样,不使用任何软件包。

L <- lapply(strsplit(a, ""), setdiff, x = letters[1:4])
L[lengths(L) == 0] <- ""
mapply(`sub`, "[?]", L, a, USE.NAMES = FALSE)
## [1] "abcd" "abcd" "abcd"

答案 1 :(得分:2)

stringr::str_replace()具有矢量替换,因此您可以执行以下操作:

library(stringr)

str_replace(a, "\\?", letters[seq_along(a) + 1])

[1] "abcd"  "abccd" "abcd" 

答案 2 :(得分:1)

您可以使用str_replace软件包中的stringr

library(stringr)
a<- c('a?cd','ab?cd','abc?') 
str_replace(a,"[?]",letters[2:4])

[1] "abcd"  "abccd" "abcd"

str_replace(a, "[?]",  c("b", "c", "d"))

[1] "abcd"  "abccd" "abcd"