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"))
感谢任何帮助。
答案 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