r - 用分隔符连接 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
一无所获。比我的大锤更整洁的解决方案(在我看来)将被接受。
解决方案
使用您的 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