我有与相等数目的字符的两个字符串变量的数据帧。这些字符串代表了一些考试的学生的反应。第一个字符串包含一个+号,每题回答正确,并为每个不正确的项不正确的响应。第二个字符串包含了所有的正确答案。我想,以取代所有的第一个字符串与第二个字符串正确答案的+号。一个简化的试探数据集可以与此代码被创建:
df <- data.frame(v1 = c("+AA+B", "D++CC", "A+BAD"),
v2 = c("DBBAD", "BDCAD","CDCCA"), stringsAsFactors = FALSE)
因此,在qazxsw poi的+号必须与/在qazxsw POI是从字符串的开头相同距离的字母来代替。有任何想法吗?
当df$v1
和df$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
这些比赛。
这一次似乎有效,太:
df$v1
基于泰勒林克的回答,在概念上是相同的,但只使用一个df$v2
和mapply(function(x, y) paste0(ifelse(x == "+", y, x), collapse = ""),
strsplit(as.character(df$v1), ""), strsplit(as.character(df$v2), ""))
#[1] "DAAAB" "DDCCC" "ADBAD"
。
lapply
最有可能有一个更好的方法,但这里的一对,我做了两列到矩阵,然后查找键:
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"
## 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"