Когда вы делаете
d %>% mutate(new1=(unlist(str_split(a,"_"))[2]))
, он передает a
столбец в str_split
.Так что это эквивалентно
unlist(str_split(d$a, "_"))
#[1] "aa" "bb" "cc" "ddd" "eee" "fff" "sss" "rrr" "eee"
, и теперь, когда вы его поднабориваете и получаете 2-й элемент, оно дает
unlist(str_split(d$a, "_"))[2]
#[1] "bb"
Следовательно, это значение присваивается всем случаям.
Чтобы решить эту проблему, вы можете добавить операцию rowwise
, чтобы получить желаемый результат, так как она будет передавать значение a
для каждой строки отдельно в str_split
.
library(tidyverse)
d %>%
rowwise() %>%
mutate(new1= unlist(str_split(a,"_"))[2])
# a new1
# <fct> <chr>
#1 aa_bb_cc bb
#2 ddd_eee_fff eee
#3 sss_rrr_eee rrr
Или другой более безопасный вариант - использовать separate
и разделить строку на разные столбцы на основе разделителя и select
соответствующий столбец
d %>%
separate(a, into = c("one", "two", "three"), sep = "_", remove = FALSE) %>%
select(a, two)
# a two
#1 aa_bb_cc bb
#2 ddd_eee_fff eee
#3 sss_rrr_eee rrr
Очевидно, что вы также можете использовать опцию base Rиспользуя sapply
и strsplit
sapply(strsplit(as.character(d$a), "_"), "[[", 2)
#[1] "bb" "eee" "rrr"