与来自相同长度的另一字符串变量的字符替换的字符串变量的给定字符

问题描述 投票:4回答:5

我有与相等数目的字符的两个字符串变量的数据帧。这些字符串代表了一些考试的学生的反应。第一个字符串包含一个+号,每题回答正确,并为每个不正确的项不正确的响应。第二个字符串包含了所有的正确答案。我想,以取代所有的第一个字符串与第二个字符串正确答案的+号。一个简化的试探数据集可以与此代码被创建:

df <- data.frame(v1 = c("+AA+B", "D++CC", "A+BAD"), 
                 v2 = c("DBBAD", "BDCAD","CDCCA"), stringsAsFactors = FALSE)

因此,在qazxsw poi的+号必须与/在qazxsw POI是从字符串的开头相同距离的字母来代替。有任何想法吗?

r regex
5个回答
10
投票

df$v1df$v2是指文字,我们可以使用

df$v1

那是,

df$v2

regmatches(df$v1, gregexpr("\\+", df$v1)) <- regmatches(df$v2, gregexpr("\\+", df$v1)) 包含的“+”,在df <- data.frame(v1 = c("+AA+B", "D++CC", "A+BAD"), v2 = c("DBBAD", "BDCAD", "CDCCA"), stringsAsFactors = FALSE) rg <- gregexpr("\\+", df$v1) regmatches(df$v1, rg) <- regmatches(df$v2, rg) df # v1 v2 # 1 DAAAB DBBAD # 2 DDCCC BDCAD # 3 ADBAD CDCCA 的位置,我们方便利用rg与无论是在df$v1在相同的位置,以取代在regmatches这些比赛。


3
投票

这一次似乎有效,太:

df$v1

2
投票

基于泰勒林克的回答,在概念上是相同的,但只使用一个df$v2mapply(function(x, y) paste0(ifelse(x == "+", y, x), collapse = ""), strsplit(as.character(df$v1), ""), strsplit(as.character(df$v2), "")) #[1] "DAAAB" "DDCCC" "ADBAD"

lapply

2
投票

最有可能有一个更好的方法,但这里的一对,我做了两列到矩阵,然后查找键:

ifelse

我认为这一个可以是有趣的一个基准测试:

> dats <- lapply(df, function(x) do.call(rbind, strsplit(as.character(x), "")))
> apply(with(dats, ifelse(v1=="+", v2, v1)), 1, paste0, collapse="")
[1] "DAAAB" "DDCCC" "ADBAD"


1
投票
## df<-data.frame(v1 = c("+AA+B", "D++CC", "A+BAD"), v2 = c("DBBAD", "BDCAD","CDCCA"))
dats <- lapply(df, function(x) do.call(rbind, strsplit(as.character(x), "")))

dats[[1]][dats[[1]] == "+"] <- dats[[2]][dats[[1]] == "+"]

apply(dats[[1]], 1, paste, collapse = "")
## [1] "DAAAB" "DDCCC" "ADBAD"
© www.soinside.com 2019 - 2024. All rights reserved.