একটি নির্দিষ্ট স্ট্রিং রয়েছে এমন সারিগুলি ফিল্টার করুন


188

স্ট্রিং রয়েছে এমন সারিটি মানদণ্ড হিসাবে আমাকে একটি ডেটা ফ্রেম ফিল্টার করতে হবে RTB

আমি ব্যবহার করছি dplyr

d.del <- df %.%
  group_by(TrackingPixel) %.%
  summarise(MonthDelivery = as.integer(sum(Revenue))) %.%
  arrange(desc(MonthDelivery))

আমি জানি আমি ফাংশন ব্যবহার করতে পারেন filterমধ্যে dplyrকিন্তু আমি ঠিক কিভাবে একটি স্ট্রিং বিষয়বস্তুর জন্য চেক করতে এটা বলতে না।

বিশেষত আমি কলামে সামগ্রীটি দেখতে চাই TrackingPixel। স্ট্রিংয়ে লেবেল থাকলে RTBআমি ফলাফলটি থেকে সারিটি সরাতে চাই।


27
আমি কখনই ব্যবহার করি নি dplyr, তবে সহায়তার দিকে তাকিয়ে ?dplyr::filterআমি কি এমন কিছু প্রস্তাব দেব যা filter(df, !grepl("RTB",TrackingPixel))সম্ভবত?
thelatemail

1
এটি আসলে যা আমি অর্জন করতে চাই তার কাছাকাছি। একমাত্র সমস্যা হ'ল সেই স্ট্রিংগুলি বজায় রাখা যা লেবেলটি অন্তর্ভুক্ত করে RTBএবং অন্যগুলি না দেখায়।
জিয়ানলুকা

আমি কেবল একটি স্টিলথ সম্পাদনা রেখেছি, এটি এখন !সামনে রেখে যোগ করা হয়েছে grepl- এটি আবার চেষ্টা করুন।
থলেটমেল

4
অথবা এর invertএবং valueযুক্তি ব্যবহার করুন grep। নিয়মিত প্রকাশগুলি পাঠ্যের সাথে কাজকে হাজার গুণ সহজ করে তোলে।
রিচ স্ক্রিভেন

4
@ থাইলেটমেল greplআমার জন্য পোস্টগ্রাজে কাজ করে না, এটি কি মাইএসকিউএল এর জন্য?
স্ট্যাটওয়ঙ্ক

উত্তর:


254

প্রশ্নের উত্তর ইতিমধ্যে @ মন্তব্যে উপরের মন্তব্যে পোস্ট করেছেন। আপনি এই জাতীয় দ্বিতীয় এবং পরবর্তী যুক্তিগুলির জন্য নিয়মিত প্রকাশ করতে পারেন filter:

dplyr::filter(df, !grepl("RTB",TrackingPixel))

যেহেতু আপনি আসল ডেটা সরবরাহ করেন নি, তাই আমি mtcarsডেটা সেট ব্যবহার করে খেলনার উদাহরণ যুক্ত করব । কল্পনা করুন যে আপনি কেবল মাজদা বা টয়োটা দ্বারা উত্পাদিত গাড়িগুলিতে আগ্রহী।

mtcars$type <- rownames(mtcars)
dplyr::filter(mtcars, grepl('Toyota|Mazda', type))

   mpg cyl  disp  hp drat    wt  qsec vs am gear carb           type
1 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4      Mazda RX4
2 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4  Mazda RX4 Wag
3 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1 Toyota Corolla
4 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1  Toyota Corona

আপনি যদি অন্যভাবে এটি করতে চান, যেমন টয়োটা এবং মাজদা গাড়ি বাদ দিয়ে, filterকমান্ডটি দেখতে এমন দেখাচ্ছে:

dplyr::filter(mtcars, !grepl('Toyota|Mazda', type))

কী যদি কলামের নামটিতে একটি স্থান থাকে। ট্র্যাকিং পিক্সেল পছন্দ।
মাইস্কিজোবাডি

3
আপনি dplyr প্যাকেজ থেকে ফিল্টার ফাংশন ব্যবহার করছেন তা নিশ্চিত করুন, স্ট্যাটাস প্যাকেজটি নয়
JHowIX

2
@ মাইস্কিজোবাডি: কলামের নামটিতে সাদা স্থান থাকলে আপনি ব্যাকটিক্স ব্যবহার করে পরিবর্তনশীল নির্বাচন করতে পারেন। উপরের উদাহরণটি সংশোধন করা হচ্ছে: mtcars$`my type` <- rownames(mtcars)এবং তারপরেmtcars %>% filter(grepl('Toyota|Mazda', `my type`))
alex23lemm

13
দয়া করে মনে রাখবেন এই যখন বস্তুর একটি হল কাজ করে না tbl_sqlযেমন greplSQL অনুবাদ করে না।
ডেভিড লেবাউর

বিকল্প 1 নিশ্চিতভাবে জানতে হবে যে dplyr সর্বশেষে লোড হয়েছে। বিকল্প 2 আপনি dplyr :: ফিল্টার উপসর্গ হয়।
ব্যবহারকারী জেটি

156

সমাধান

এটা ব্যবহার করা সম্ভব str_detectএর stringrপ্যাকেজের মধ্যে অন্তর্ভুক্ত করা tidyverseপ্যাকেজ। str_detectপ্রদান করে Trueবা Falseনির্দিষ্ট ভেক্টরটিতে কিছু নির্দিষ্ট স্ট্রিং রয়েছে কিনা তা দেখায়। এই বুলিয়ান মানটি ব্যবহার করে ফিল্টার করা সম্ভব। প্যাকেজ সম্পর্কে বিশদ জানতে স্ট্রিংারের পরিচিতি দেখুন stringr

library(tidyverse)
# ─ Attaching packages ──────────────────── tidyverse 1.2.1 ─
# ✔ ggplot2 2.2.1     ✔ purrr   0.2.4
# ✔ tibble  1.4.2     ✔ dplyr   0.7.4
# ✔ tidyr   0.7.2     ✔ stringr 1.2.0
# ✔ readr   1.1.1     ✔ forcats 0.3.0
# ─ Conflicts ───────────────────── tidyverse_conflicts() ─
# ✖ dplyr::filter() masks stats::filter()
# ✖ dplyr::lag()    masks stats::lag()

mtcars$type <- rownames(mtcars)
mtcars %>%
  filter(str_detect(type, 'Toyota|Mazda'))
# mpg cyl  disp  hp drat    wt  qsec vs am gear carb           type
# 1 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4      Mazda RX4
# 2 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4  Mazda RX4 Wag
# 3 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1 Toyota Corolla
# 4 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1  Toyota Corona

স্ট্রিংর সম্পর্কে ভাল জিনিস

আমরা বরং ব্যবহার করা উচিত stringr::str_detect()চেয়ে base::grepl()। নিম্নলিখিত কারণগুলি রয়েছে কারণ এটি।

  • stringrপ্যাকেজ সরবরাহিত ফাংশনগুলি উপসর্গ দিয়ে শুরু হয় str_, যা কোডটি পড়া সহজ করে তোলে।
  • stringrপ্যাকেজটির ক্রিয়াকলাপগুলির প্রথম যুক্তি সর্বদা ডেটা.ফ্রেম (বা মান) হয়, তারপরে প্যারামিটার আসে ((আপনাকে পাওলো ধন্যবাদ)
object <- "stringr"
# The functions with the same prefix `str_`.
# The first argument is an object.
stringr::str_count(object) # -> 7
stringr::str_sub(object, 1, 3) # -> "str"
stringr::str_detect(object, "str") # -> TRUE
stringr::str_replace(object, "str", "") # -> "ingr"
# The function names without common points.
# The position of the argument of the object also does not match.
base::nchar(object) # -> 7
base::substr(object, 1, 3) # -> "str"
base::grepl("str", object) # -> TRUE
base::sub("str", "", object) # -> "ingr"

মাপকাঠি

নিম্নরূপ মানদণ্ড পরীক্ষার ফলাফল। বড় ডেটাফ্রেমের জন্য, str_detectদ্রুততর।

library(rbenchmark)
library(tidyverse)

# The data. Data expo 09. ASA Statistics Computing and Graphics 
# http://stat-computing.org/dataexpo/2009/the-data.html
df <- read_csv("Downloads/2008.csv")
print(dim(df))
# [1] 7009728      29

benchmark(
  "str_detect" = {df %>% filter(str_detect(Dest, 'MCO|BWI'))},
  "grepl" = {df %>% filter(grepl('MCO|BWI', Dest))},
  replications = 10,
  columns = c("test", "replications", "elapsed", "relative", "user.self", "sys.self"))
# test replications elapsed relative user.self sys.self
# 2      grepl           10  16.480    1.513    16.195    0.248
# 1 str_detect           10  10.891    1.000     9.594    1.281

1
স্ট্রিংর গ্রেপের চেয়ে ভাল বিকল্প কেন?
ক্যামেরননেমো

2
@ ক্যামেরননিমো stringrপ্যাকেজ সরবরাহিত ফাংশনগুলি প্রিফিক্স str_ দিয়ে শুরু হয়, যা কোডটি পড়তে সহজ করে তোলে। সাম্প্রতিক আধুনিক আর কোডে, স্ট্রিংগার ব্যবহার করার পরামর্শ দেওয়া হচ্ছে।
কেইকু

3
আমি মনে করি এটি একটি খুব ব্যক্তিগত পছন্দ এবং আমি @ ক্যামেরননেমো এর সাথে একমত যে base Rএটি যতটা ভাল stringr। আপনি যদি আমাদের কিছু 'শক্ত তথ্য' যেমন বেঞ্চমার্কিং সরবরাহ করে এবং কেবল "এটি সুপারিশ করা হয়" (কে এটি সুপারিশ করেন না) বলে উল্লেখ না করে তবে এটি অত্যন্ত প্রশংসিত হবে। ধন্যবাদ
তেজেবো

2
অন্য কারণটি পরিপাটি কাঠামোর মধ্যে ধারাবাহিকতা: একটি ফাংশনের প্রথম যুক্তি সর্বদা ডেটা.ফ্রেম (বা মান) হয়, তারপরে প্যারামিটারগুলি আসে।
পাওলো

22

এই উত্তরটি অন্যদের মতো, তবে পছন্দসই stringr::str_detectএবং dplyr ব্যবহার করে rownames_to_column

library(tidyverse)

mtcars %>% 
  rownames_to_column("type") %>% 
  filter(stringr::str_detect(type, 'Toyota|Mazda') )

#>             type  mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#> 1      Mazda RX4 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
#> 2  Mazda RX4 Wag 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
#> 3 Toyota Corolla 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
#> 4  Toyota Corona 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1

2018-06-26 এ ডিপেক্স প্যাকেজ (v0.2.0) দ্বারা তৈরি হয়েছিল ।


1
str_detectহয় stringrপ্যাকেজ
jsta

3

এখানে আরেকটি ব্যাপার tidyverseসমাধান, ব্যবহার filter_at। সুবিধাটি হ'ল আপনি সহজেই একাধিক কলামে প্রসারিত করতে পারেন। যে কোনও কলামে filter_allস্ট্রিংটি সন্ধান করার জন্য নীচে একটি সমাধান নীচে , উদাহরণস্বরূপ ব্যবহার করে স্ট্রিং "V" সন্ধান করুনdiamonds

library(tidyverse)

# for only one column... extendable to more than one creating a column list in `vars`!
mtcars %>% 
  rownames_to_column("type") %>% 
  filter_at(.vars= vars(type), all_vars(!grepl('Toyota|Mazda',.))) %>%
  head()
#>                type  mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#> 1        Datsun 710 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
#> 2    Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
#> 3 Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
#> 4           Valiant 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#> 5        Duster 360 14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
#> 6         Merc 240D 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
```

যে কোনও কলামে স্ট্রিং : ব্যবহার করুনfilter_all

#remove all rows where any column contains 'V'
    diamonds %>% 
      filter_all(all_vars(!grepl('V',.))) %>%
      head
    #> # A tibble: 6 x 10
    #>   carat cut     color clarity depth table price     x     y     z
    #>   <dbl> <ord>   <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
    #> 1  0.23 Ideal   E     SI2      61.5    55   326  3.95  3.98  2.43
    #> 2  0.21 Premium E     SI1      59.8    61   326  3.89  3.84  2.31
    #> 3  0.31 Good    J     SI2      63.3    58   335  4.34  4.35  2.75
    #> 4  0.3  Good    J     SI1      64      55   339  4.25  4.28  2.73
    #> 5  0.22 Premium F     SI1      60.4    61   342  3.88  3.84  2.33
    #> 6  0.31 Ideal   J     SI2      62.2    54   344  4.35  4.37  2.71
    #get all rows where any column contains 'V'
    diamonds %>%
    filter_all(any_vars(grepl('V',.))) %>%
      head
    #> # A tibble: 6 x 10
    #>   carat cut       color clarity depth table price     x     y     z
    #>   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
    #> 1 0.23  Good      E     VS1      56.9    65   327  4.05  4.07  2.31
    #> 2 0.290 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63
    #> 3 0.24  Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48
    #> 4 0.24  Very Good I     VVS1     62.3    57   336  3.95  3.98  2.47
    #> 5 0.26  Very Good H     SI1      61.9    55   337  4.07  4.11  2.53
    #> 6 0.22  Fair      E     VS2      65.1    61   337  3.87  3.78  2.49

<sup>Created on 2020-04-01 by the [reprex package](https://reprex.tidyverse.org) (v0.3.0)</sup>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.