首页 > 解决方案 > 用分隔符连接 R 字符串 - 第一次除外

问题描述

我有一个对数据框进行一些检查的过程,并且在每次检查检查是否通过时,我想将文本添加到带有分隔符的列中。因此,假设在第 2 行和第 3 行第一个测试通过后,该msg列中包含“第一个”。然后第二个测试更新了该ok列,并且对于第 1 行和第 2 行是正确的,给出以下内容:

> d = data.frame(ok=c(TRUE,TRUE,FALSE,FALSE), msg=c("", "first","first",""))
> d
     ok   msg
1  TRUE      
2  TRUE first
3 FALSE first
4 FALSE  

所以下一步是msg只在第 1 行和第 2 行的列中添加“第二个”,结果是:

     ok          msg
1  TRUE       second
2  TRUE first;second
3 FALSE        first
4 FALSE            

我不知道该怎么做。这第一次努力在初始情况下留下了一个领先的分隔符:

> paste(d$msg[d$ok],"second", sep=";")
[1] ";second"      "first;second"

这将返回一个长度为 3 的向量,这显然是错误的:

> paste(c(d$msg[d$ok],"second"), sep=";")
[1] ""       "first"  "second"

并且任何collapse返回长度为 1 的向量也是错误的。

大锤解决方案是使用上面的第一个努力,然后在最后去除任何前导分隔符,但这很难看。我希望有更整洁的东西。

解决方案应该只使用基本的 R 函数,并且最初的“空字符串”不一定是""- 但我玩过但NA一无所获。比我的大锤更整洁的解决方案(在我看来)将被接受。

标签: rstring

解决方案


使用您的 dataframe d,我们可以使用基本ifelse函数来解决您的分隔符问题:

d$msg <- as.character(d$msg)

d$msg[d$ok] <- ifelse(d$msg[d$ok] == "", "second", paste(d$msg[d$ok], "second", sep=";"))

输出:

     ok          msg
1  TRUE       second
2  TRUE first;second
3 FALSE        first
4 FALSE             

推荐阅读