R 根据条件移动[-]符号

R 根据条件移动[-]符号,r,R,我还在学习R,你们这些家伙在教育性的回答上帮了我很大的忙。 这就是我的问题,它可能是非常基本的,但我尝试了sub、gsub和casewhen的解决方案,没有得到任何结果。我有一列数字,右边有[-]号。如果他们有-我想把它提前 col<- c("1.000","100-","12.000-","12.568-", "100","150","1.000.000-&q

我还在学习R,你们这些家伙在教育性的回答上帮了我很大的忙。 这就是我的问题,它可能是非常基本的,但我尝试了sub、gsub和casewhen的解决方案,没有得到任何结果。我有一列数字,右边有[-]号。如果他们有-我想把它提前

col<- c("1.000","100-","12.000-","12.568-", "100","150","1.000.000-")
col2<-c("A","B","C","D","E","F","G")
A<-cbind(col2,col)
A<-as.data.frame(A)
col您可以执行以下操作:

sub((.*)-$,“-\\1”,A$col)
#> [1] "1.000"      "-100"       "-12.000"    "-12.568"    "100"      "150"   
#> [7] "-1.000.000"
您可以执行以下操作:

sub((.*)-$,“-\\1”,A$col)
#> [1] "1.000"      "-100"       "-12.000"    "-12.568"    "100"      "150"   
#> [7] "-1.000.000"

您还可以编写一个ifelse,检查字符串中的最后一个字符是否为破折号,并在这种情况下将其粘贴到前面:

library(stringr)

A %>% 
  mutate(col_edit = ifelse(str_sub(col,-1,-1) == "-",
                           paste0("-",str_sub(col,1,-2)),
                           col))

  col2        col   col_edit
1    A      1.000      1.000
2    B       100-       -100
3    C    12.000-    -12.000
4    D    12.568-    -12.568
5    E        100        100
6    F        150        150
7    G 1.000.000- -1.000.000

您还可以编写一个ifelse,检查字符串中的最后一个字符是否为破折号,在这种情况下,将其粘贴到前面:

library(stringr)

A %>% 
  mutate(col_edit = ifelse(str_sub(col,-1,-1) == "-",
                           paste0("-",str_sub(col,1,-2)),
                           col))

  col2        col   col_edit
1    A      1.000      1.000
2    B       100-       -100
3    C    12.000-    -12.000
4    D    12.568-    -12.568
5    E        100        100
6    F        150        150
7    G 1.000.000- -1.000.000

使用
str\u替换

library(stringr)
A$col - str_replace(A$col, "^(.*)-$", "-\\1")
A$col
#[1] "1.000"      "-100"       "-12.000"    "-12.568"    "100"        "150"        "-1.000.000"

使用
str\u替换

library(stringr)
A$col - str_replace(A$col, "^(.*)-$", "-\\1")
A$col
#[1] "1.000"      "-100"       "-12.000"    "-12.568"    "100"        "150"        "-1.000.000"

哎呀。谢谢@Konradrudolph谢谢!它工作得很好,但是你能解释一下逻辑吗?这样我就可以改进我的编码了
sub
使用正则表达式在字符向量的每个字符串中查找单个匹配项。正则表达式
(.*)-$
表示“如果字符串以
-
结尾,则匹配并捕获每个字符串中除最后一个
-
之外的所有字符”。然后用替换字符串替换匹配的字符,替换字符串是一个
-
,后跟
\\1
,表示“原始string.Oops中捕获的所有字符。谢谢@Konradrudolph谢谢!它工作得很好,但是你能解释一下逻辑吗?这样我就可以改进我的编码了
sub
使用正则表达式在字符向量的每个字符串中查找单个匹配项。正则表达式
(.*)-$
表示“如果字符串以
-
结尾,则匹配并捕获每个字符串中除最后一个
-
之外的所有字符”。然后用替换字符串替换匹配的字符,替换字符串是一个
-
,后跟
\\1
,表示“原始字符串中捕获的所有字符”。