我正在尝试使用tidyr来分隔数据框中的一列,同时仅将其应用于特定行。虽然dplyr :: filter完成了这项工作,但它省略了我的其余数据。是否有一种干净的方法将tidyr应用于特定行,同时保持其余数据不变?
这是我的问题的一个例子:
#creating DF for the example
df<-data.frame(var_a=letters[1:5],
var_b=c(sample(1:100,5)),
text=c("foo_bla","here_do","oh_yes","baa","land"))
给了我这个:
var_a var_b text 1 a 10 foo_bla 2 b 58 here_do 3 c 34 oh_yes 4 d 1 baa 5 e 47 land
#separating one col:
clean_df<-df %>% separate(text,into=c("first","sec"),sep="_",remove=F)
clean_df
var_a var_b text first sec 1 a 10 foo_bla foo bla 2 b 58 here_do here do 3 c 34 oh_yes oh yes 4 d 1 baa baa <NA> 5 e 47 land land <NA>
我想只拆分“here_do”行。 提前感谢您的任何帮助!
答案 0 :(得分:3)
另一种方法:
cols_to_split = c('here_do')
clean_df <-df %>%
filter(text %in% cols_to_split) %>%
tidyr::separate(text,into=c("first","sec"),sep="_",remove=F) %>%
bind_rows(filter(df, !text %in% cols_to_split))
# var_a var_b text first sec
#1 b 7 here_do here do
#2 a 26 foo_bla <NA> <NA>
#3 c 23 oh_yes <NA> <NA>
#4 d 2 baa <NA> <NA>
#5 e 67 land <NA> <NA>
如果您需要将其余行保留在第一列&#39;中,您可以使用:
clean_df <-df %>%
filter(text %in% cols_to_split) %>%
tidyr::separate(text,into=c("first","sec"),sep="_",remove=F) %>%
bind_rows(filter(df, !text %in% cols_to_split)) %>%
mutate(first = ifelse(is.na(first), as.character(text), first))
# var_a var_b text first sec
#1 b 7 here_do here do
#2 a 26 foo_bla foo_bla <NA>
#3 c 23 oh_yes oh_yes <NA>
#4 d 2 baa baa <NA>
#5 e 67 land land <NA>
答案 1 :(得分:1)
我们可以在base R
中通过替换“text”列中“here_do”的分隔符进行此操作,即使用sub
将其更改为“here,do”,并使用{{1}进行读取原始数据集
read.csv
cbind
如果我们需要cbind(df, read.csv(text=sub("(?<=here)_(?=do)", ",", df$text,
perl = TRUE), header=FALSE, col.names = c("first", "sec")))
# var_a var_b text first sec
#1 a 93 foo_bla foo_bla
#2 b 51 here_do here do
#3 c 65 oh_yes oh_yes
#4 d 70 baa baa
#5 e 32 land land
解决方案,请使用tidyr
extract