주제가 거의 소진되었습니다. 출력 열의 수를 모르는 약간 더 일반적인 버전에 대한 솔루션을 제공하고 싶습니다. 예를 들어
before = data.frame(attr = c(1,30,4,6), type=c('foo_and_bar','foo_and_bar_2', 'foo_and_bar_2_and_bar_3', 'foo_and_bar'))
attr type
1 1 foo_and_bar
2 30 foo_and_bar_2
3 4 foo_and_bar_2_and_bar_3
4 6 foo_and_bar
separate()
분할하기 전에 결과 열의 수를 모르기 때문에 dplyr을 사용할 수 없으므로 생성 stringr
된 열의 패턴과 이름 접두사가 주어지면 열을 분할하는 데 사용하는 함수를 만들었습니다 . 사용 된 코딩 패턴이 정확하기를 바랍니다.
split_into_multiple <- function(column, pattern = ", ", into_prefix){
cols <- str_split_fixed(column, pattern, n = Inf)
# Sub out the ""'s returned by filling the matrix to the right, with NAs which are useful
cols[which(cols == "")] <- NA
cols <- as.tibble(cols)
# name the 'cols' tibble as 'into_prefix_1', 'into_prefix_2', ..., 'into_prefix_m'
# where m = # columns of 'cols'
m <- dim(cols)[2]
names(cols) <- paste(into_prefix, 1:m, sep = "_")
return(cols)
}
그런 다음 split_into_multiple
dplyr 파이프에서 다음과 같이 사용할 수 있습니다 .
after <- before %>%
bind_cols(split_into_multiple(.$type, "_and_", "type")) %>%
# selecting those that start with 'type_' will remove the original 'type' column
select(attr, starts_with("type_"))
>after
attr type_1 type_2 type_3
1 1 foo bar <NA>
2 30 foo bar_2 <NA>
3 4 foo bar_2 bar_3
4 6 foo bar <NA>
그런 다음 gather
정리할 수 있습니다.
after %>%
gather(key, val, -attr, na.rm = T)
attr key val
1 1 type_1 foo
2 30 type_1 foo
3 4 type_1 foo
4 6 type_1 foo
5 1 type_2 bar
6 30 type_2 bar_2
7 4 type_2 bar_2
8 6 type_2 bar
11 4 type_3 bar_3
left_right <- str_split_fixed(as.character(split_df),'\">',2)