R语言 如何删除字符形式的数值并根据单元号重新排序字符串

wpx232ag  于 2023-07-31  发布在  其他
关注(0)|答案(6)|浏览(112)

我有这根线

D = c("0" , "11", "12", "13", "14", "15", "16", "21", "22", "23", "24", "25", "26", "31", "32", "33", "34", "35", "36", "41", "42", "43", "44","45", "46","51","52", "53", "54", "55", "56", "61", "62", "63", "64", "65", "66")

字符串
1.如果我想删除那些小于30的字符而不将字符串转换为数字,我应该怎么做?
1.如果我想根据单元号重新排序字符串(意味着所有最后1的字符串都在最后2的字符串之前,等等,例如31,41,51,61,32,42等等,应该是哪个操作?
谢啦,谢啦

3wabscal

3wabscal1#

您不必转换为数字,D[D >= 30]工作正常。>=也适用于字符向量,排序取决于您的语言环境。查看?Comparison了解更多详情。

D[D >= "30"]
#[1] "31" "32" "33" "34" "35" "36" "41" "42" "43" "44" "45" "46" "51" "52" "53" "54" "55" "56" "61" "62" "63" "64" "65" "66"

字符串
对于排序,这将起作用(但可能只有当您有2位数的数字时):

str_rev <- stringi::stri_reverse
str_rev(sort(str_rev(D[D >= "30"])))
# [1] "31" "41" "51" "61" "32" "42" "52" "62" "33" "43" "53" "63" "34" "44" "54" "64" "35"
#[18] "45" "55" "65" "36" "46" "56" "66"


str_sub

library(stringr)        
D[order(str_sub(D, -1, -1))]

sqxo8psd

sqxo8psd2#

不知道我是否遵循你的逻辑,但这个解决方案怎么样?

D[str_detect(D,"^[12]\\d|0$")]

字符串
正则表达式代码基本上是以1/2开头,后跟数字或0的任何代码。它需要stringr软件包9(tidyverse的一部分)。你可以使用baseR,但要习惯tidyverse,它更好(base R将是grepl(pattern,string))否则我会def去D[D<30],但这可能是作弊

iaqfqrcu

iaqfqrcu3#

请检查下面的代码

D2 <- enframe(D) %>% arrange(value) %>% filter(value>30) %>% 
mutate(value2=str_extract(value,'\\d$')) %>% 
  arrange(value2) %>% pull(value)

字符串
创建于2023-07-14带有reprex v2.0.2

[1] "31" "41" "51" "61" "32" "42" "52" "62" "33" "43" "53" "63" "34"
[14] "44" "54" "64" "35" "45" "55" "65" "36" "46" "56" "66"

ecfdbz9o

ecfdbz9o4#

1.)可以通过比较操作!=来完成,该操作不进行数字转换(对于数字字符串<= 2位)。
2.)是一种排序操作,其内部可能依赖于数字或ASCII码表字母排序的转换。

D_new <- D[sapply(strsplit(D, ""), \(x) 
  ifelse(length(x) > 1 & x[1] != "1" & x[1] != "2", T, F))]

D_new[order(sapply(strsplit(D_new, ""), \(x) x[2]))]
 [1] "31" "41" "51" "61" "32" "42" "52" "62" "33" "43" "53" "63" "34" "44" "54"
[16] "64" "35" "45" "55" "65" "36" "46" "56" "66"

字符串

bvpmtnay

bvpmtnay5#

另一种提取第二个数字的方法是将D除以10并使用余数。下面是它的样子:

library(tidyverse)

D <- D[D >= 30]

data.frame(D) |>
  mutate(second_digit = as.numeric(D) %% 10) |>
  arrange(second_digit) |>
  filter(D > 30) |>
  pull(D)
#>  [1] "31" "41" "51" "61" "32" "42" "52" "62" "33" "43" "53" "63" "34" "44" "54"
#> [16] "64" "35" "45" "55" "65" "36" "46" "56" "66"

字符串

k10s72fa

k10s72fa6#

regex的另一个选择。任何数字3-9后面跟着另一个数字0-9。

D[grepl("^[3-9][0-9]", D)]
#>  [1] "31" "32" "33" "34" "35" "36" "41" "42" "43" "44" "45" "46" "51" "52" "53"
#> [16] "54" "55" "56" "61" "62" "63" "64" "65" "66"

字符串

相关问题