删除R中混合字符串中破折号后的字符

时间:2021-05-17 17:05:03

标签: r

data
  V9         V10 V11    
1 neutral -0.204 PRKCZ-AS1
2 neutral  0.037 FAAP20-AS1   
3 neutral  0.041 PRKCZ-AS1    
4 neutral  0.041 FAAP20-ZA12   
5 neutral  0.133 PRKCZ-SAS13    
6 neutral  0.133 FAAP20-SAS9999

这是我的数据框,其中一列包含以破折号分隔的字符串。我想删除破折号和后面的字符。 最后,我想要一个输出如下:

data
  V9         V10 V11    
1 neutral -0.204 PRKCZ
2 neutral  0.037 FAAP20 
3 neutral  0.041 PRKCZ  
4 neutral  0.041 FAAP20   
5 neutral  0.133 PRKCZ   
6 neutral  0.133 FAAP20

可重现的样本数据

structure(list(V9 = c("neutral", "neutral", "neutral", "neutral", 
"neutral", "neutral"), V10 = c(-0.204, 0.037, 0.041, 0.041, 0.133, 
0.133), V11 = c("PRKCZ-AS1", "FAAP20-AS1", "PRKCZ-AS1", "FAAP20-ZA12", 
"PRKCZ-SAS13", "FAAP20-SAS9999")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))

感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

我们可以使用 sub 中的 base R

data$V11 <- sub("-.*", "", data$V11)

或者用trimws

data$V11 <- trimws(data$V11, whitespace = '-.*')

答案 1 :(得分:2)

我们可以使用 separate

library(dplyr)
df %>%
  separate("V11", c("V11", "V11a")) %>% 
  select(-V11a)

输出:

  V9         V10 V11   
  <chr>    <dbl> <chr> 
1 neutral -0.204 PRKCZ 
2 neutral  0.037 FAAP20
3 neutral  0.041 PRKCZ 
4 neutral  0.041 FAAP20
5 neutral  0.133 PRKCZ 
6 neutral  0.133 FAAP20

答案 2 :(得分:2)

你也可以使用这个解决方案,虽然不像亲爱的@akrun 那样出色和简洁:

library(dplyr)
library(stringr)

str_locate(df$V11, "-") %>%
  as_tibble() %>%
  select(start) %>%
  bind_cols(df) %>%
  mutate(V11 = str_sub(V11, 1L, start-1))

# A tibble: 6 x 4
  start V9         V10 V11   
* <int> <chr>    <dbl> <chr> 
1     6 neutral -0.204 PRKCZ 
2     7 neutral  0.037 FAAP20
3     6 neutral  0.041 PRKCZ 
4     7 neutral  0.041 FAAP20
5     6 neutral  0.133 PRKCZ 
6     7 neutral  0.133 FAAP20

答案 3 :(得分:1)

如果您使用的是 tidyverse,您可以只使用 stringr::str_remove...

data %>% mutate(V11 = str_remove(V11, "-.+"))

       V9    V10    V11
1 neutral -0.204  PRKCZ
2 neutral  0.037 FAAP20
3 neutral  0.041  PRKCZ
4 neutral  0.041 FAAP20
5 neutral  0.133  PRKCZ
6 neutral  0.133 FAAP20
相关问题