একটি কলামে আংশিক স্ট্রিং মিলের ভিত্তিতে ডেটা ফ্রেম সারি নির্বাচন করা


99

আমি একটি কলামে স্ট্রিংয়ের আংশিক মিলের উপর ভিত্তি করে একটি ডেটা ফ্রেম থেকে সারিগুলি নির্বাচন করতে চাই, যেমন কলাম 'x' এ "hsa" স্ট্রিং রয়েছে। ব্যবহার sqldf- যদি এটির likeবাক্য গঠন থাকে - আমি এমন কিছু করব:

select * from <> where x like 'hsa'

দুর্ভাগ্যক্রমে, sqldfএই সিনট্যাক্স সমর্থন করে না।

বা অনুরূপ:

selectedRows <- df[ , df$x %like% "hsa-"]

কোনটি অবশ্যই কাজ করে না।

কেউ দয়া করে আমাকে এই সাহায্য করতে পারেন?


6
আপনি কিছু পছন্দ করে নিজের ডেটা কয়েক লাইন পোস্ট করতে পারেন dput(head(conservedData))
A5C1D2H2I1M1N2O1R2T1

উত্তর:


151

আমি লক্ষ্য করেছি যে আপনি %like%আপনার বর্তমান পদ্ধতির কোনও ফাংশন উল্লেখ করেছেন । %like%"ডেটা টেবিল" থেকে এটি কোনও রেফারেন্স কিনা তা আমি জানি না তবে এটি যদি হয় তবে আপনি অবশ্যই নীচের হিসাবে এটি ব্যবহার করতে পারেন।

মনে রাখবেন যে অবজেক্টটি কোনও হতে হবে না data.table(তবে এটিও মনে রাখবেন যে data.frames এবং data.tables এর জন্য সাবসেটিং পদ্ধতিগুলি অভিন্ন নয়):

library(data.table)
mtcars[rownames(mtcars) %like% "Merc", ]
iris[iris$Species %like% "osa", ]

যদি এটি আপনার কাছে থাকে তবে সম্ভবত আপনি ডেটা সাবসেট করার জন্য সারি এবং কলামের অবস্থানগুলি মিশ্রিত করেছেন।


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

mtcars[grep("Merc", rownames(mtcars)), ]
             mpg cyl  disp  hp drat   wt qsec vs am gear carb
# Merc 240D   24.4   4 146.7  62 3.69 3.19 20.0  1  0    4    2
# Merc 230    22.8   4 140.8  95 3.92 3.15 22.9  1  0    4    2
# Merc 280    19.2   6 167.6 123 3.92 3.44 18.3  1  0    4    4
# Merc 280C   17.8   6 167.6 123 3.92 3.44 18.9  1  0    4    4
# Merc 450SE  16.4   8 275.8 180 3.07 4.07 17.4  0  0    3    3
# Merc 450SL  17.3   8 275.8 180 3.07 3.73 17.6  0  0    3    3
# Merc 450SLC 15.2   8 275.8 180 3.07 3.78 18.0  0  0    3    3

এবং, আরেকটি উদাহরণ, irisস্ট্রিংটির জন্য ডেটাসেট অনুসন্ধান করে osa:

irisSubset <- iris[grep("osa", iris$Species), ]
head(irisSubset)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
# 4          4.6         3.1          1.5         0.2  setosa
# 5          5.0         3.6          1.4         0.2  setosa
# 6          5.4         3.9          1.7         0.4  setosa

আপনার সমস্যার জন্য চেষ্টা করুন:

selectedRows <- conservedData[grep("hsa-", conservedData$miRNA), ]

+1: এছাড়াও grepনিয়মিত এক্সপ্রেশন সমর্থন করে যাতে আপনি ^hsa-পরিবর্তে গ্রেপ করতে চাইতে পারেন নোট করুন।
নিকো

4
@নিকো: আসলে, grepজি / রে / পি (বিশ্বব্যাপী / নিয়মিত প্রকাশ / মুদ্রণ) এড কমান্ড থেকে এসেছে এবং এটি কেবলমাত্র নিয়মিত এক্সপ্রেশন-ফু ;-) এর মাস্টারকে তার আসল শক্তি প্রকাশ করে: en.wikedia.org/ উইকি /
গ্রেপ

4
% মত% পরামর্শ মহান! আমি আপনার উত্তরের উপরে রাখার পরামর্শ দিচ্ছি।
অ্যারেন কাম্ব্রে

@ আরেনকাম্ব্রে, সম্পন্ন সম্ভবত এটি আমাকে আরও 11 টি ভোট পেতে সহায়তা করবে যাতে বছরের শেষের আগে আমি একটি নতুন টুপি পেতে পারি :-)
A5C1D2H2I1M1N2O1R2T1

@ A5C1D2H2I1M1N2O1R2T1 দুর্দান্ত উত্তর! একসাথে ঘটে যাওয়া দুটি স্ট্রিং (যেমন "পোষা প্রাণী" এবং "পাইপ" যেমন "পিটার পাইপার" হিসাবে ডেটাফ্রেমের সারি সংঘটিত হয়) অনুসন্ধান করার জন্য% এর মতো% ব্যবহার করার কোনও উপায় আছে কি?
nigus21

62

ব্যবহার করে দেখুন str_detect()থেকে stringr প্যাকেজ, যা একটি স্ট্রিং উপস্থিতি অথবা একটি প্যাটার্ন অভাবে সনাক্ত করে।

%>%পাইপ এবং dplyr প্যাকেজ filter()থেকে অন্তর্ভুক্ত এমন একটি পদ্ধতি এখানে দেওয়া হয়েছে :

library(stringr)
library(dplyr)

CO2 %>%
  filter(str_detect(Treatment, "non"))

   Plant        Type  Treatment conc uptake
1    Qn1      Quebec nonchilled   95   16.0
2    Qn1      Quebec nonchilled  175   30.4
3    Qn1      Quebec nonchilled  250   34.8
4    Qn1      Quebec nonchilled  350   37.2
5    Qn1      Quebec nonchilled  500   35.3
...

এটি সারিগুলির জন্য নমুনা সিও 2 ডেটা সেট (যেটি আর এর সাথে আসে) ফিল্টার করে যেখানে চিকিত্সা ভেরিয়েবলটিতে "অ" অন্তর্ভুক্ত রয়েছে contains str_detectস্থির মিলগুলি খুঁজে পাওয়া যায় বা একটি রেজেক্স ব্যবহার করে তা আপনি সামঞ্জস্য করতে পারেন - স্ট্রিংয়ের প্যাকেজের জন্য ডকুমেন্টেশন দেখুন।


আপনি এই জাতীয় trc_detect ফাংশনটিও ব্যবহার করতে পারেনmyDataFrame[str_detect(myDataFrame$key, myKeyPattern),]
বেমিপেফ

21

LIKE স্ক্লাইটে কাজ করা উচিত:

require(sqldf)
df <- data.frame(name = c('bob','robert','peter'),id=c(1,2,3))
sqldf("select * from df where name LIKE '%er%'")
    name id
1 robert  2
2  peter  3

এসকিউএলডিএফ তালিকা করার জন্য সেরা। তবে এটি সারিগুলি মুছতে পারে না।
স্যুট আতান পিএইচডি

4
কেন একটি আর প্যাকেজের সাথে লোড করা হচ্ছে require()এখানে
rgalbo

কারণ এটি স্ট্যান্ডার্ড আর লাইব্রেরি নয় এবং আপনাকে এটি ম্যানুয়ালি ইনস্টল করতে হবে এবং তারপরে requireফাংশন ব্যবহার করে লোড করতে হবে ।
বারটেকার্টানাস

0

অন্য বিকল্পটি কেবল greplফাংশন ব্যবহার করা হবে:

df[grepl('er', df$name), ]
CO2[grepl('non', CO2$Treatment), ]

df <- data.frame(name = c('bob','robert','peter'),
                 id = c(1,2,3)
                 )

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