R 只查找一次包含特定字符的数据帧行

R 只查找一次包含特定字符的数据帧行,r,R,很抱歉可能会重复,但我真的不知道如何制定我的请求。我致力于R,我希望能够一次性识别包含特定字符的数据帧单元 在mydf中,我有一列a,其中包含存储为字符串的公式,例如 #a 1y~x1+x2 2y~x2+x3 3y~x1+x2+x3 4y~x2+x4 5y~x1+x3+x4 我想保留列a中的公式有两个解释变量的行,即只包含一个“+”。我们的想法是过滤并添加一种虚拟的东西,比如输出 #a b 1y~x1+x21 2y~x2+x31 3y~x1+x2+x30 4y~x2+x41 5y~x1+x3+x

很抱歉可能会重复,但我真的不知道如何制定我的请求。我致力于R,我希望能够一次性识别包含特定字符的数据帧单元

在my
df
中,我有一列
a
,其中包含存储为字符串的公式,例如

#a

1y~x1+x2

2y~x2+x3

3y~x1+x2+x3

4y~x2+x4

5y~x1+x3+x4

我想保留列
a
中的公式有两个解释变量的行,即只包含一个“+”。我们的想法是过滤并添加一种虚拟的东西,比如输出

#a b

1y~x1+x21

2y~x2+x31

3y~x1+x2+x30

4y~x2+x41

5y~x1+x3+x40

希望这足够清楚。谢谢你的帮助,

Val

您可以使用
gsub
[^+]
提取所有
+
nchar
以获取它们的编号

x$b <- +(nchar(gsub("[^+]", "", x$a)) == 1)
x
#           a b
#1    y~x1+x2 1
#2    y~x2+x3 1
#3 y~x1+x2+x3 0
#4    y~x2+x4 1
#5 y~x1+x3+x4 0
或者使用@ThomasIsCoding建议的
长度

lengths(gregexpr("\\+", x$a)) == 1
#[1]  TRUE  TRUE FALSE  TRUE FALSE
或者使用
grepl

grepl("^[^+]*\\+[^+]*$", x$a)
#[1]  TRUE  TRUE FALSE  TRUE FALSE
或使用strsplit
strsplit

sapply(strsplit(x$a, ""), function(y) sum(y == "+")==1)
#[1]  TRUE  TRUE FALSE  TRUE FALSE
数据:


x您可以使用
gsub
[^+]
提取所有
+
nchar
以获取它们的编号

x$b <- +(nchar(gsub("[^+]", "", x$a)) == 1)
x
#           a b
#1    y~x1+x2 1
#2    y~x2+x3 1
#3 y~x1+x2+x3 0
#4    y~x2+x4 1
#5 y~x1+x3+x4 0
或者使用@ThomasIsCoding建议的
长度

lengths(gregexpr("\\+", x$a)) == 1
#[1]  TRUE  TRUE FALSE  TRUE FALSE
或者使用
grepl

grepl("^[^+]*\\+[^+]*$", x$a)
#[1]  TRUE  TRUE FALSE  TRUE FALSE
或使用strsplit
strsplit

sapply(strsplit(x$a, ""), function(y) sum(y == "+")==1)
#[1]  TRUE  TRUE FALSE  TRUE FALSE
数据:


x另一个基本R解决方案是使用
gregexpr
,即

df$b <- +(lengths(gregexpr("\\+",df$a))==1)
数据

df <- structure(list(a = c("y~x1+x2", "y~x2+x3", "y~x1+x2+x3", "y~x2+x4", 
"y~x1+x3+x4")), class = "data.frame", row.names = c("1", "2", 
"3", "4", "5"))

df另一个基本R解决方案是使用
gregexpr
,即

df$b <- +(lengths(gregexpr("\\+",df$a))==1)
数据

df <- structure(list(a = c("y~x1+x2", "y~x2+x3", "y~x1+x2+x3", "y~x2+x4", 
"y~x1+x3+x4")), class = "data.frame", row.names = c("1", "2", 
"3", "4", "5"))

df假设公式中始终至少有两个预测值,则第三个基本备选方案

df$b <- +(!grepl("\\+.*\\+", df$a))

df
           a b
1    y~x1+x2 1
2    y~x2+x3 1
3 y~x1+x2+x3 0
4    y~x2+x4 1
5 y~x1+x3+x4 0

df$b假设公式中始终至少有两个预测值,则第三个基本备选方案

df$b <- +(!grepl("\\+.*\\+", df$a))

df
           a b
1    y~x1+x2 1
2    y~x2+x3 1
3 y~x1+x2+x3 0
4    y~x2+x4 1
5 y~x1+x3+x4 0

df$b伟大的解决方案库+1我使用了nchar解决方案,一切正常,谢谢!伟大的解决方案画廊+1我使用了nchar解决方案,一切正常,谢谢!