বিষয়টি প্রায় ক্লান্ত হয়ে পড়েছে, আমি চাই আপনি কিছুটা সাধারণ সংস্করণে এমন কোনও সমাধানের প্রস্তাব দিতে চাই যেখানে আপনি আউটপুট কলামগুলির সংখ্যা জানেন না, একটি অগ্রাধিকার। উদাহরণস্বরূপ আপনার আছে
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()
পারি না কারণ বিভক্ত হওয়ার আগে আমরা ফলাফল কলামগুলির সংখ্যা জানি না, তাই আমি তখন একটি ফাংশন 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)