কলামে বিভক্ত স্ট্রিংগুলি একটি কলামে পৃথক সারিগুলিতে বিভক্ত করুন


109

আমার মতো একটি ডেটা ফ্রেম রয়েছে:

data.frame(director = c("Aaron Blaise,Bob Walker", "Akira Kurosawa", 
                        "Alan J. Pakula", "Alan Parker", "Alejandro Amenabar", "Alejandro Gonzalez Inarritu", 
                        "Alejandro Gonzalez Inarritu,Benicio Del Toro", "Alejandro González Iñárritu", 
                        "Alex Proyas", "Alexander Hall", "Alfonso Cuaron", "Alfred Hitchcock", 
                        "Anatole Litvak", "Andrew Adamson,Marilyn Fox", "Andrew Dominik", 
                        "Andrew Stanton", "Andrew Stanton,Lee Unkrich", "Angelina Jolie,John Stevenson", 
                        "Anne Fontaine", "Anthony Harvey"), AB = c('A', 'B', 'A', 'A', 'B', 'B', 'B', 'A', 'B', 'A', 'B', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'A'))

আপনি দেখতে পাচ্ছেন, directorকলামে কিছু এন্ট্রি কমা দ্বারা পৃথক করা একাধিক নাম। অন্যান্য কলামের মান বজায় রেখে আমি এই এন্ট্রিগুলিকে পৃথক সারিতে বিভক্ত করতে চাই। উদাহরণস্বরূপ, উপরের ডেটা ফ্রেমের প্রথম সারিটি দুটি সারিতে বিভক্ত করা উচিত, directorকলামে প্রতিটি নাম এবং কলামে 'এ' থাকবে AB


2
কেবল স্পষ্টতই জিজ্ঞাসা করতে হবে: এই তথ্যটি কি আপনার ইন্টারভিউগুলিতে পোস্ট করা উচিত?
রিকার্ডো সাপোর্টা

1
তারা "সমস্ত বি মুভি ছিল না"। যথেষ্ট নিরীহ বলে মনে হচ্ছে।
ম্যাথু লুন্ডবার্গ

24
এই সমস্ত লোকই একাডেমি পুরষ্কার মনোনীত, যা আমি খুব কমই গোপন বলে মনে করি =)
রয়েলটিস

উত্তর:


79

এই পুরানো প্রশ্নটি প্রায়শই ডুপ টার্গেট হিসাবে ব্যবহৃত হয় (ট্যাগযুক্ত r-faq)। আজ অবধি, এটির জন্য তিনবার 6 টি ভিন্ন ভিন্ন পদ্ধতির প্রস্তাব দেওয়া হয়েছে তবে দিকনির্দেশ হিসাবে কোন একটি পদ্ধতির দ্রুততম 1 তা একটি মানদণ্ডের অভাব বোধ করছে

বেঞ্চমার্কযুক্ত সমাধানগুলির মধ্যে অন্তর্ভুক্ত রয়েছে

microbenchmarkপ্যাকেজটি ব্যবহার করে মোট 8 টি বিভিন্ন পদ্ধতির 6 টি বিভিন্ন আকারের ডেটা ফ্রেমের উপর বেঞ্চমার্ক করা হয়েছিল (নীচের কোডটি দেখুন)।

ওপি দ্বারা প্রদত্ত নমুনা তথ্যে কেবল 20 টি সারি রয়েছে। বৃহত্তর ডেটা ফ্রেম তৈরি করতে, এই 20 টি সারিগুলি কেবল 1, 10, 100, 1000, 10000 এবং 100000 বার পুনরাবৃত্তি করা হয় যা 2 মিলিয়ন সারি পর্যন্ত সমস্যার আকার দেয়।

বেঞ্চমার্ক ফলাফল

এখানে চিত্র বর্ণনা লিখুন

মানদণ্ডের ফলাফলগুলি দেখায় যে পর্যাপ্ত পরিমাণে বড় ডেটা ফ্রেমের জন্য সমস্ত data.tableপদ্ধতি অন্য কোনও পদ্ধতির চেয়ে দ্রুত faster প্রায় 5000 টিরও বেশি সারি সহ ডেটা ফ্রেমের জন্য, জাপের data.tableপদ্ধতি 2 এবং ভেরিয়েন্টটি DT3সবচেয়ে দ্রুত এবং ধীরতম পদ্ধতির চেয়ে ম্যাগনিটিউড।

লক্ষণীয়ভাবে, দুটি tidyverseপদ্ধতির সময়সীমা এবং splistackshapeসমাধানটি এতটাই সমান যে চার্টের কার্ভগুলিকে ছদ্মবেশী করা কঠিন। এগুলি সমস্ত ডেটা ফ্রেমের আকারের মাপকাঠির মধ্যে ধীরতম পদ্ধতি।

ছোট ডেটা ফ্রেমের জন্য, ম্যাটসের বেস আর সমাধান এবং data.tableপদ্ধতি 4 টি অন্যান্য পদ্ধতির চেয়ে কম ওভারহেড বলে মনে হচ্ছে।

কোড

director <- 
  c("Aaron Blaise,Bob Walker", "Akira Kurosawa", "Alan J. Pakula", 
    "Alan Parker", "Alejandro Amenabar", "Alejandro Gonzalez Inarritu", 
    "Alejandro Gonzalez Inarritu,Benicio Del Toro", "Alejandro González Iñárritu", 
    "Alex Proyas", "Alexander Hall", "Alfonso Cuaron", "Alfred Hitchcock", 
    "Anatole Litvak", "Andrew Adamson,Marilyn Fox", "Andrew Dominik", 
    "Andrew Stanton", "Andrew Stanton,Lee Unkrich", "Angelina Jolie,John Stevenson", 
    "Anne Fontaine", "Anthony Harvey")
AB <- c("A", "B", "A", "A", "B", "B", "B", "A", "B", "A", "B", "A", 
        "A", "B", "B", "B", "B", "B", "B", "A")

library(data.table)
library(magrittr)

সমস্যার আকারের বেঞ্চমার্ক রানগুলির জন্য ফাংশনটি সংজ্ঞায়িত করুন n

run_mb <- function(n) {
  # compute number of benchmark runs depending on problem size `n`
  mb_times <- scales::squish(10000L / n , c(3L, 100L)) 
  cat(n, " ", mb_times, "\n")
  # create data
  DF <- data.frame(director = rep(director, n), AB = rep(AB, n))
  DT <- as.data.table(DF)
  # start benchmarks
  microbenchmark::microbenchmark(
    matt_mod = {
      s <- strsplit(as.character(DF$director), ',')
      data.frame(director=unlist(s), AB=rep(DF$AB, lengths(s)))},
    jaap_DT1 = {
      DT[, lapply(.SD, function(x) unlist(tstrsplit(x, ",", fixed=TRUE))), by = AB
         ][!is.na(director)]},
    jaap_DT2 = {
      DT[, strsplit(as.character(director), ",", fixed=TRUE), 
         by = .(AB, director)][,.(director = V1, AB)]},
    jaap_dplyr = {
      DF %>% 
        dplyr::mutate(director = strsplit(as.character(director), ",")) %>%
        tidyr::unnest(director)},
    jaap_tidyr = {
      tidyr::separate_rows(DF, director, sep = ",")},
    cSplit = {
      splitstackshape::cSplit(DF, "director", ",", direction = "long")},
    DT3 = {
      DT[, strsplit(as.character(director), ",", fixed=TRUE),
         by = .(AB, director)][, director := NULL][
           , setnames(.SD, "V1", "director")]},
    DT4 = {
      DT[, .(director = unlist(strsplit(as.character(director), ",", fixed = TRUE))), 
         by = .(AB)]},
    times = mb_times
  )
}

বিভিন্ন সমস্যার আকারের জন্য বেঞ্চমার্ক চালান

# define vector of problem sizes
n_rep <- 10L^(0:5)
# run benchmark for different problem sizes
mb <- lapply(n_rep, run_mb)

প্লট করার জন্য ডেটা প্রস্তুত করুন

mbl <- rbindlist(mb, idcol = "N")
mbl[, n_row := NROW(director) * n_rep[N]]
mba <- mbl[, .(median_time = median(time), N = .N), by = .(n_row, expr)]
mba[, expr := forcats::fct_reorder(expr, -median_time)]

চার্ট তৈরি করুন

library(ggplot2)
ggplot(mba, aes(n_row, median_time*1e-6, group = expr, colour = expr)) + 
  geom_point() + geom_smooth(se = FALSE) + 
  scale_x_log10(breaks = NROW(director) * n_rep) + scale_y_log10() + 
  xlab("number of rows") + ylab("median of execution time [ms]") +
  ggtitle("microbenchmark results") + theme_bw()

সেশনের তথ্য এবং প্যাকেজ সংস্করণ (অংশ)

devtools::session_info()
#Session info
# version  R version 3.3.2 (2016-10-31)
# system   x86_64, mingw32
#Packages
# data.table      * 1.10.4  2017-02-01 CRAN (R 3.3.2)
# dplyr             0.5.0   2016-06-24 CRAN (R 3.3.1)
# forcats           0.2.0   2017-01-23 CRAN (R 3.3.2)
# ggplot2         * 2.2.1   2016-12-30 CRAN (R 3.3.2)
# magrittr        * 1.5     2014-11-22 CRAN (R 3.3.0)
# microbenchmark    1.4-2.1 2015-11-25 CRAN (R 3.3.3)
# scales            0.4.1   2016-11-09 CRAN (R 3.3.2)
# splitstackshape   1.4.2   2014-10-23 CRAN (R 3.3.3)
# tidyr             0.6.1   2017-01-10 CRAN (R 3.3.2)

1 আমার কৌতূহল এই উচ্ছৃঙ্খল মন্তব্য দ্বারা আবদ্ধ হয়েছিল উজ্জ্বল! দ্রুততার অর্ডার! একটি থেকে tidyverseউত্তর একটি প্রশ্ন যা এই প্রশ্নই সদৃশ হিসাবে বন্ধ ছিল।


নিস! দেখে মনে হচ্ছে সিএসপ্লিট এবং আলাদা_রোজের উন্নতির জন্য জায়গা (যা বিশেষত এটি করার জন্য ডিজাইন করা হয়েছে)। বিটিডব্লিউ, সিএসপ্লিট এছাড়াও একটি স্থির = আরগ নেয় এবং এটি একটি ডেটা টেবিল ভিত্তিক প্যাকেজ, সুতরাং এটি ডিএফের পরিবর্তে ডিটিও দিতে পারে। এছাড়াও, আমি ফ্যাক্টর থেকে চরে রূপান্তর মানদণ্ডের অন্তর্গত বলে মনে করি না (যেহেতু এটি শুরু হওয়ার সাথে সাথে চর হওয়া উচিত)। আমি পরীক্ষা করে দেখেছি এবং এর মধ্যে কোনও পরিবর্তনই গুণগতভাবে ফলাফলগুলিতে কিছুই করে না।
ফ্রাঙ্ক

1
@ ফ্র্যাঙ্ক মানদণ্ডের উন্নতি করতে এবং ফলাফলের প্রভাব যাচাই করার জন্য আপনার পরামর্শগুলির জন্য আপনাকে ধন্যবাদ। এই তুলে নেব যখন পরবর্তী সংস্করণ মুক্তির পর একটি আপডেট করছেন data.table, dplyrইত্যাদি
Uwe

আমি মনে করি যে পন্থাগুলি তুলনীয় নয়, কমপক্ষে সমস্ত ক্ষেত্রে নয়, কারণ ডেটেটেবল পদ্ধতিগুলি কেবলমাত্র "নির্বাচিত" কলামগুলির সাথে সারণী তৈরি করে, অন্যদিকে ডিপি্লায়ার সমস্ত কলামের সাথে ফলাফল উত্পন্ন করে (বিশ্লেষণে জড়িত না এমনগুলিও অন্তর্ভুক্ত না করে) ফাংশনে তাদের নাম লিখতে)।
ফেরোও

5
@ ফেরোও এটি ভুল, ডেটা.টিবলগুলি "টেবিলে" জায়গায় পরিবর্তিত করে, সমস্ত কলামগুলি রাখা হয়, আপনি যদি সেই জায়গায় সংশোধন না করেন তবে আপনি যা চেয়েছিলেন কেবল তারই ফিল্টারযুক্ত অনুলিপি পাবেন। সংক্ষিপ্ত ডেটাতে. টেবিল পদ্ধতির ফলস্বরূপ ডেটাসেট তৈরি না করে ডেটাসেট আপডেট করা, এটি ডাটা ডেটেবল এবং ডিপি্লায়ারের মধ্যে আসল পার্থক্য।
তেনসিবাই

1
সত্যিই দুর্দান্ত তুলনা! সম্ভবত আপনি যখন matt_mod এবং jaap_dplyr যোগ করতে পারেন strsplit fixed=TRUE। অন্যটির মতো এটিরও সময় অনুযায়ী প্রভাব পড়বে। যেহেতু আর 4.0.0 , ডিফল্ট, যখন একজন তৈরি data.frame, তাই stringsAsFactors = FALSE, তাই as.characterমুছে যেতে পারে।
GKi

94

বেশ কয়েকটি বিকল্প:

1) সাথে দুটি উপায় :

library(data.table)
# method 1 (preferred)
setDT(v)[, lapply(.SD, function(x) unlist(tstrsplit(x, ",", fixed=TRUE))), by = AB
         ][!is.na(director)]
# method 2
setDT(v)[, strsplit(as.character(director), ",", fixed=TRUE), by = .(AB, director)
         ][,.(director = V1, AB)]

2) ক / সমন্বয়:

library(dplyr)
library(tidyr)
v %>% 
  mutate(director = strsplit(as.character(director), ",")) %>%
  unnest(director)

3) সাথে শুধুমাত্র: সঙ্গে tidyr 0.5.0(এবং পরে), তবে আপনাকে ঠিক ব্যবহার করতে পারেন separate_rows:

separate_rows(v, director, sep = ",")

convert = TRUEসংখ্যাগুলি কলামগুলিতে স্বয়ংক্রিয়ভাবে রূপান্তর করতে আপনি প্যারামিটারটি ব্যবহার করতে পারেন ।

4) বেস আর সহ:

# if 'director' is a character-column:
stack(setNames(strsplit(df$director,','), df$AB))

# if 'director' is a factor-column:
stack(setNames(strsplit(as.character(df$director),','), df$AB))

একসাথে একাধিক কলামের জন্য এটি করার কোনও উপায় আছে কি? উদাহরণস্বরূপ 3 টি কলাম যার প্রতিটি স্ট্রিং ";" দ্বারা পৃথক হয়েছে প্রতিটি কলামে একই সংখ্যক স্ট্রিং রয়েছে। মানে data.table(id= "X21", a = "chr1;chr1;chr1", b="123;133;134",c="234;254;268")হচ্ছে data.table(id = c("X21","X21",X21"), a=c("chr1","chr1","chr1"), b=c("123","133","134"), c=c("234","254","268"))?
রিলস্টাইন

1
বাহ ঠিক বুঝতে পেরে এটি ইতিমধ্যে একাধিক কলামের জন্য একবারে কাজ করে - এটি আশ্চর্যজনক!
রিয়েলস্টাইন

@ রিলস্টাইন আপনি কীভাবে ভাগ করে নিতে পারেন যে আপনি একাধিক কলামের জন্য কীভাবে এটি রূপান্তর করেছেন? আমার একই ব্যবহারের কেস রয়েছে তবে কীভাবে এটি করা যায় তা সম্পর্কে নিশ্চিত।
মুন_ওয়াচার

1
উপরের উত্তরের উত্তর_মুন_ওয়াচার পদ্ধতি 1 ইতিমধ্যে একাধিক কলামের জন্য কাজ করে যা আমি ভেবেছিলাম আশ্চর্যজনক। setDT(dt)[,lapply(.SD, function(x) unlist(tstrsplit(x, ";",fixed=TRUE))), by = ID]এটা আমার জন্য কাজ করেছে।
রিলস্টাইন

51

আপনার আসল ডাটা.ফ্রেমে নামকরণ v, আমাদের কাছে এটি রয়েছে:

> s <- strsplit(as.character(v$director), ',')
> data.frame(director=unlist(s), AB=rep(v$AB, sapply(s, FUN=length)))
                      director AB
1                 Aaron Blaise  A
2                   Bob Walker  A
3               Akira Kurosawa  B
4               Alan J. Pakula  A
5                  Alan Parker  A
6           Alejandro Amenabar  B
7  Alejandro Gonzalez Inarritu  B
8  Alejandro Gonzalez Inarritu  B
9             Benicio Del Toro  B
10 Alejandro González Iñárritu  A
11                 Alex Proyas  B
12              Alexander Hall  A
13              Alfonso Cuaron  B
14            Alfred Hitchcock  A
15              Anatole Litvak  A
16              Andrew Adamson  B
17                 Marilyn Fox  B
18              Andrew Dominik  B
19              Andrew Stanton  B
20              Andrew Stanton  B
21                 Lee Unkrich  B
22              Angelina Jolie  B
23              John Stevenson  B
24               Anne Fontaine  B
25              Anthony Harvey  A

repনতুন এবি কলামটি তৈরিতে ব্যবহারটি নোট করুন । এখানে, sapplyপ্রতিটি সারি সারিগুলির নামের সংখ্যা প্রদান করে।


1
আমি ভাবছি যদি `AB = rep (v $ AB, তালিকাভুক্ত না হওয়া (sapply (গুলি, FUN = দৈর্ঘ্য))) more আরও বেশি অস্পষ্টতার চেয়ে বুঝতে আরও সহজ হতে পারে vapply? vapplyএখানে আরও কিছু উপযুক্ত করে তোলে ?
আইআরটিএফএম

7
আজকাল sapply(s, length)সঙ্গে প্রতিস্থাপন করা যেতে পারে lengths(s)
ধনী স্ক্রিভেন

31

পার্টিতে দেরীতে, তবে আর একটি সাধারণ বিকল্প হ'ল cSplitআমার "স্প্লিটস্ট্যাকশপে" প্যাকেজটি ব্যবহার করা যা একটি directionযুক্তিযুক্ত। "long"আপনি যে ফলাফলটি নির্দিষ্ট করেছেন তা পেতে এটি সেট করুন :

library(splitstackshape)
head(cSplit(mydf, "director", ",", direction = "long"))
#              director AB
# 1:       Aaron Blaise  A
# 2:         Bob Walker  A
# 3:     Akira Kurosawa  B
# 4:     Alan J. Pakula  A
# 5:        Alan Parker  A
# 6: Alejandro Amenabar  B

2
devtools::install_github("yikeshu0611/onetree")

library(onetree)

dd=spread_byonecolumn(data=mydata,bycolumn="director",joint=",")

head(dd)
            director AB
1       Aaron Blaise  A
2         Bob Walker  A
3     Akira Kurosawa  B
4     Alan J. Pakula  A
5        Alan Parker  A
6 Alejandro Amenabar  B

0

বেসstrsplit থেকে ব্যবহার করে অন্য একটি বেঞ্চমার্ককে বর্তমানে কলামে পৃথক করা স্ট্রিংগুলিকে পৃথক সারিতে বিভক্ত করার সুপারিশ করা যেতে পারে , কারণ এটি আকারের বিস্তৃতের চেয়ে দ্রুততম ছিল:

s <- strsplit(v$director, ",", fixed=TRUE)
s <- data.frame(director=unlist(s), AB=rep(v$AB, lengths(s)))

নোট করুন যে ব্যবহারের fixed=TRUEসময় উপর উল্লেখযোগ্য প্রভাব আছে।

সারিগুলির সংখ্যার উপরে গণনার সময় দেখানো রেখাচিত্রগুলি

তুলনা পদ্ধতি:

met <- alist(base = {s <- strsplit(v$director, ",") #Matthew Lundberg
   s <- data.frame(director=unlist(s), AB=rep(v$AB, sapply(s, FUN=length)))}
 , baseLength = {s <- strsplit(v$director, ",") #Rich Scriven
   s <- data.frame(director=unlist(s), AB=rep(v$AB, lengths(s)))}
 , baseLeFix = {s <- strsplit(v$director, ",", fixed=TRUE)
   s <- data.frame(director=unlist(s), AB=rep(v$AB, lengths(s)))}
 , cSplit = s <- cSplit(v, "director", ",", direction = "long") #A5C1D2H2I1M1N2O1R2T1
 , dt = s <- setDT(v)[, lapply(.SD, function(x) unlist(tstrsplit(x, "," #Jaap
   , fixed=TRUE))), by = AB][!is.na(director)]
#, dt2 = s <- setDT(v)[, strsplit(director, "," #Jaap #Only Unique
#  , fixed=TRUE), by = .(AB, director)][,.(director = V1, AB)]
 , dplyr = {s <- v %>%  #Jaap
    mutate(director = strsplit(director, ",", fixed=TRUE)) %>%
    unnest(director)}
 , tidyr = s <- separate_rows(v, director, sep = ",") #Jaap
 , stack = s <- stack(setNames(strsplit(v$director, ",", fixed=TRUE), v$AB)) #Jaap
#, dt3 = {s <- setDT(v)[, strsplit(director, ",", fixed=TRUE), #Uwe #Only Unique
#  by = .(AB, director)][, director := NULL][, setnames(.SD, "V1", "director")]}
 , dt4 = {s <- setDT(v)[, .(director = unlist(strsplit(director, "," #Uwe
   , fixed = TRUE))), by = .(AB)]}
 , dt5 = {s <- vT[, .(director = unlist(strsplit(director, "," #Uwe
   , fixed = TRUE))), by = .(AB)]}
   )

লাইব্রেরি:

library(microbenchmark)
library(splitstackshape) #cSplit
library(data.table) #dt, dt2, dt3, dt4
#setDTthreads(1) #Looks like it has here minor effect
library(dplyr) #dplyr
library(tidyr) #dplyr, tidyr

ডেটা:

v0 <- data.frame(director = c("Aaron Blaise,Bob Walker", "Akira Kurosawa", 
                        "Alan J. Pakula", "Alan Parker", "Alejandro Amenabar", "Alejandro Gonzalez Inarritu", 
                        "Alejandro Gonzalez Inarritu,Benicio Del Toro", "Alejandro González Iñárritu", 
                        "Alex Proyas", "Alexander Hall", "Alfonso Cuaron", "Alfred Hitchcock", 
                        "Anatole Litvak", "Andrew Adamson,Marilyn Fox", "Andrew Dominik", 
                        "Andrew Stanton", "Andrew Stanton,Lee Unkrich", "Angelina Jolie,John Stevenson", 
                        "Anne Fontaine", "Anthony Harvey"), AB = c('A', 'B', 'A', 'A', 'B', 'B', 'B', 'A', 'B', 'A', 'B', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'A'))

গণনা এবং সময় ফলাফল:

n <- 10^(0:5)
x <- lapply(n, function(n) {v <- v0[rep(seq_len(nrow(v0)), n),]
  vT <- setDT(v)
  ti <- min(100, max(3, 1e4/n))
  microbenchmark(list = met, times = ti, control=list(order="block"))})

y <- do.call(cbind, lapply(x, function(y) aggregate(time ~ expr, y, median)))
y <- cbind(y[1], y[-1][c(TRUE, FALSE)])
y[-1] <- y[-1] / 1e6 #ms
names(y)[-1] <- paste("n:", n * nrow(v0))
y #Time in ms
#         expr     n: 20    n: 200    n: 2000   n: 20000   n: 2e+05   n: 2e+06
#1        base 0.2989945 0.6002820  4.8751170  46.270246  455.89578  4508.1646
#2  baseLength 0.2754675 0.5278900  3.8066300  37.131410  442.96475  3066.8275
#3   baseLeFix 0.2160340 0.2424550  0.6674545   4.745179   52.11997   555.8610
#4      cSplit 1.7350820 2.5329525 11.6978975  99.060448 1053.53698 11338.9942
#5          dt 0.7777790 0.8420540  1.6112620   8.724586  114.22840  1037.9405
#6       dplyr 6.2425970 7.9942780 35.1920280 334.924354 4589.99796 38187.5967
#7       tidyr 4.0323765 4.5933730 14.7568235 119.790239 1294.26959 11764.1592
#8       stack 0.2931135 0.4672095  2.2264155  22.426373  289.44488  2145.8174
#9         dt4 0.5822910 0.6414900  1.2214470   6.816942   70.20041   787.9639
#10        dt5 0.5015235 0.5621240  1.1329110   6.625901   82.80803   636.1899

নোট, মত পদ্ধতি

(v <- rbind(v0[1:2,], v0[1,]))
#                 director AB
#1 Aaron Blaise,Bob Walker  A
#2          Akira Kurosawa  B
#3 Aaron Blaise,Bob Walker  A

setDT(v)[, strsplit(director, "," #Jaap #Only Unique
  , fixed=TRUE), by = .(AB, director)][,.(director = V1, AB)]
#         director AB
#1:   Aaron Blaise  A
#2:     Bob Walker  A
#3: Akira Kurosawa  B

পরিচালকেরstrsplit জন্য একটি ফেরত দিন এবং এর সাথে তুলনীয় হতে পারেunique

tmp <- unique(v)
s <- strsplit(tmp$director, ",", fixed=TRUE)
s <- data.frame(director=unlist(s), AB=rep(tmp$AB, lengths(s)))

তবে আমার বোঝার জন্য, এটি জিজ্ঞাসা করা হয়নি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.