确定字符串中的第 3 位数字是否为 R 中的 0
Determine if 3rd digit in string is 0 in R
试图找出代码来确定(字符串中的第 3 个数字是 0)还是(第 3 个是 5,第 4 个是 6),但似乎找不到任何东西。如果我不是专门寻找特定字符 numbers/digits.
,感觉就像一件简单的事情
x <- c( "123456" , "124567" , "125600" )
我如何测试上面的例子,结果是 FALSE FALSE TRUE?
提前致谢!
我们可以用sub
截取第3位和第4位数字,判断是否等于56
sub("^..(..).*", "\1", x) == 56
#[1] FALSE FALSE TRUE
或者用substr
substr(x, 3,4) == 56
#[1] FALSE FALSE TRUE
替代regex
表达式,您可以使用strsplit
:
x <- c( "123456" , "124567" , "125600","120156" )
sapply(x,function(v) unlist(strsplit(v,""))[3] ==0)
123456 124567 125600 120156
FALSE FALSE FALSE TRUE
sapply(x,function(v) unlist(strsplit(v,""))[4:5] == c(5,6))
123456 124567 125600 120156
[1,] FALSE TRUE FALSE FALSE
[2,] FALSE TRUE FALSE FALSE
# Or with the correct order:
sapply(x,function(v) paste0(unlist(strsplit(v,""))[3:4],collapse = "") == 56)
123456 124567 125600 120156
FALSE FALSE TRUE FALSE
测试第三位数字是否为零
substr( c( "123456" , "124567" , "125600" , "30000" ) , 3,3) %in% 0
检查是否
- 第 3 位为 0,或
- 第 3 个数字是 5,第 4 个数字是 6
x <- c( "123456" , "124567" , "125600", "120234")
sub("^..((0|56)).*","\1",x) %in% c(0,56)
# [1] FALSE FALSE TRUE TRUE
对等长字符串执行此操作的一种方法。
x <- c( "123456" , "124567" , "125600" )
x <- as.data.frame(strsplit(x, ""), stringsAsFactors = FALSE, fix.empty.names = FALSE)
x[3,] %in% 3 # [1] TRUE FALSE FALSE
x[3,] %in% 0 # [1] FALSE FALSE FALSE
x[4,] %in% 6 # [1] FALSE FALSE TRUE
不等长字符串
x <- c( "123456" , "124567" , "1256000" )
x <- strsplit(x, "")
x <- sapply(x, "[", i = seq_len(max(lengths(x))))
x[3,] %in% 3 # [1] TRUE FALSE FALSE
x[3,] %in% 0 # [1] FALSE FALSE FALSE
x[4,] %in% 6 # [1] FALSE FALSE TRUE
我们可以使用substring
从特定位置获取字符。
substring(x, 3, 3) == 0 | substring(x, 3, 4) == 56
#[1] FALSE FALSE TRUE
正如您所解释的,substring(x, 3, 3) == 0
检查第 3 位数字是否为 0 或 (|
) 第 3 和第 4 位数字 substring(x, 3, 4)
是否分别为 56
。
试图找出代码来确定(字符串中的第 3 个数字是 0)还是(第 3 个是 5,第 4 个是 6),但似乎找不到任何东西。如果我不是专门寻找特定字符 numbers/digits.
,感觉就像一件简单的事情x <- c( "123456" , "124567" , "125600" )
我如何测试上面的例子,结果是 FALSE FALSE TRUE?
提前致谢!
我们可以用sub
截取第3位和第4位数字,判断是否等于56
sub("^..(..).*", "\1", x) == 56
#[1] FALSE FALSE TRUE
或者用substr
substr(x, 3,4) == 56
#[1] FALSE FALSE TRUE
替代regex
表达式,您可以使用strsplit
:
x <- c( "123456" , "124567" , "125600","120156" )
sapply(x,function(v) unlist(strsplit(v,""))[3] ==0)
123456 124567 125600 120156
FALSE FALSE FALSE TRUE
sapply(x,function(v) unlist(strsplit(v,""))[4:5] == c(5,6))
123456 124567 125600 120156
[1,] FALSE TRUE FALSE FALSE
[2,] FALSE TRUE FALSE FALSE
# Or with the correct order:
sapply(x,function(v) paste0(unlist(strsplit(v,""))[3:4],collapse = "") == 56)
123456 124567 125600 120156
FALSE FALSE TRUE FALSE
测试第三位数字是否为零
substr( c( "123456" , "124567" , "125600" , "30000" ) , 3,3) %in% 0
检查是否
- 第 3 位为 0,或
- 第 3 个数字是 5,第 4 个数字是 6
x <- c( "123456" , "124567" , "125600", "120234")
sub("^..((0|56)).*","\1",x) %in% c(0,56)
# [1] FALSE FALSE TRUE TRUE
对等长字符串执行此操作的一种方法。
x <- c( "123456" , "124567" , "125600" )
x <- as.data.frame(strsplit(x, ""), stringsAsFactors = FALSE, fix.empty.names = FALSE)
x[3,] %in% 3 # [1] TRUE FALSE FALSE
x[3,] %in% 0 # [1] FALSE FALSE FALSE
x[4,] %in% 6 # [1] FALSE FALSE TRUE
不等长字符串
x <- c( "123456" , "124567" , "1256000" )
x <- strsplit(x, "")
x <- sapply(x, "[", i = seq_len(max(lengths(x))))
x[3,] %in% 3 # [1] TRUE FALSE FALSE
x[3,] %in% 0 # [1] FALSE FALSE FALSE
x[4,] %in% 6 # [1] FALSE FALSE TRUE
我们可以使用substring
从特定位置获取字符。
substring(x, 3, 3) == 0 | substring(x, 3, 4) == 56
#[1] FALSE FALSE TRUE
正如您所解释的,substring(x, 3, 3) == 0
检查第 3 位数字是否为 0 或 (|
) 第 3 和第 4 位数字 substring(x, 3, 4)
是否分别为 56
。