如果在一列中为TRUE,则更改其他列中的值

时间:2017-07-04 12:48:53

标签: r

我有一个字符向量:(缩短版本显示)

Unit <- c("e10", "e11", "10e10", "10e11")

我想应用以下条件:如果值以&#39; e&#39;开头,则替换&#39; e&#39;用&#39; 10e&#39;这样最终的矢量看起来像这样:

"10e10" "10e11" "10e10" "10e11"

我使用startsWith()创建一个TRUE / FALSE向量:

startsWith.e <- startsWith(Unit, "e")

这假设为FALSE FALSE。

最后,我想运行for或while循环(或某种条件),这样当startsWith.e为TRUE时,值为&#39; e&#39;在单位中替换为&#39; 10e&#39;。

while(startsWith.e){
grep("e", "10e", Unit) }

然而,我陷入无限循环并使用if语句表示它只会评估第一个语句(因此会更改所有情况因为它将评估为TRUE)。

希望有人可以提供帮助!

4 个答案:

答案 0 :(得分:4)

我们可以使用sub。在字符串的开头(^)匹配字母'e'并替换为'10e'

sub("^e", "10e", Unit)
#[1] "10e10" "10e11" "10e10" "10e11"

答案 1 :(得分:1)

使用startsWith和子集,您可以

Unit[startsWith(Unit, "e")] <- paste0("10", Unit[startsWith(Unit, "e")])

返回

Unit
[1] "10e10" "10e11" "10e10" "10e11"

答案 2 :(得分:0)

如果你想使用for,就像这样(但这是lmo答案的更长版本):

Unit <- c("e10", "e11", "10e10", "10e11")
startsWith.e <- startsWith(Unit, "e")
for (i in 1:length(Unit)) {
 if (startsWith.e[i]) {
    Unit[i] <- paste0("10", Unit[i])
  }
}
Unit
#> [1] "10e10" "10e11" "10e10" "10e11"

答案 3 :(得分:0)

(我的答案是多余的...... @akrun已经用sub解决了它)

为什么不使用gsub ..?

Unit <- c("e10", "e11", "10e10", "10e11")
gsub("^e","10e",Unit)
[1] "10e10" "10e11" "10e10" "10e11"