ভেক্টর হিসাবে dplyr tbl কলামটি বের করুন


175

একটি dplyr টিবিএল এর একটি কলাম একটি ভেক্টর হিসাবে পেতে টিবিএল থেকে ডাটাবেস ব্যাক-এন্ড (যেমন ডেটা ফ্রেম / টেবিলটি সরাসরি উপসেট হতে পারে না) পাওয়ার আরও একটি সুসংগত উপায় আছে কি?

require(dplyr)
db <- src_sqlite(tempfile(), create = TRUE)
iris2 <- copy_to(db, iris)
iris2$Species
# NULL

এটা খুব সহজ হত, তাই

collect(select(iris2, Species))[, 1]
# [1] "setosa"     "setosa"     "setosa"     "setosa"  etc.

তবে কিছুটা আনাড়ি মনে হচ্ছে।


হয় collect(iris2)$Speciesকম কদাকার?
সিজে ইয়েটম্যান 25'17

উত্তর:


178

Dplyr 0.7.0 দিয়ে, আপনি pullএকটি থেকে ভেক্টর পেতে ব্যবহার করতে পারেন tbl


library("dplyr")
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
db <- src_sqlite(tempfile(), create = TRUE)
iris2 <- copy_to(db, iris)
vec <- pull(iris2, Species)
head(vec)
#> [1] "setosa" "setosa" "setosa" "setosa" "setosa" "setosa"

96

@ ন্যাকনুডাসের মন্তব্য অনুসারে, দেখে মনে হচ্ছে কোনও pullফাংশন dplyr 0.6 এ কার্যকর হয়েছিল:

iris2 %>% pull(Species)

Dplyr এর পুরানো সংস্করণগুলির জন্য, কলামটি কিছুটা উত্তম করে তুলতে এখানে একটি সুন্দর ফাংশন রয়েছে (টাইপ করা সহজ, এবং সহজভাবে পড়া সহজ):

pull <- function(x,y) {x[,if(is.name(substitute(y))) deparse(substitute(y)) else y, drop = FALSE][[1]]}

এটি আপনাকে এর যে কোনও একটি করতে দেয়:

iris2 %>% pull('Species')
iris2 %>% pull(Species)
iris2 %>% pull(5)

এর ফলাফল ...

 [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7 15.0 21.4

এবং এটি ডেটা ফ্রেমের সাথেও দুর্দান্ত কাজ করে:

> mtcars %>% pull(5)
 [1] 3.90 3.90 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 3.92 3.07 3.07 3.07 2.93 3.00 3.23 4.08 4.93 4.22 3.70 2.76 3.15 3.73 3.08 4.08 4.43
[28] 3.77 4.22 3.62 3.54 4.11

এর v0.2 এ করার একটি দুর্দান্ত উপায় dplyr:

iris2 %>% select(Species) %>% collect %>% .[[5]]

বা আপনি যদি পছন্দ করেন:

iris2 %>% select(Species) %>% collect %>% .[["Species"]]

অথবা যদি আপনার টেবিলটি খুব বড় না হয় তবে কেবল ...

iris2 %>% collect %>% .[["Species"]]

2
আমি আপনার টান ফাংশন পছন্দ। কেবলমাত্র একটি মাত্র পরিবর্তনশীল ক্ষেত্রে কেবল একটি pull <- function(x, y) { if (ncol(x) == 1) y <- 1 else y x[ , if (is.name(substitute(y))) deparse(substitute(y)) else y, drop = FALSE][[1]] }iris2 %>% pull()
সরলকরণ যুক্ত করব

7
আপনি কোনও ডেটা ফ্রেম থেকে ভেক্টর টানতে magrittrএক্সপোজেশন অপারেটর ( %$%) ব্যবহার করতে পারেন । অর্থাত iris2 %>% select(Species) %>% collect() %$% Species
সৈকত

@ লুক 1018 আপনার এই মন্তব্যটির বাইরে একটি উত্তর তৈরি করা উচিত
rrs করুন

pull()dplyr সংস্করণ 0.6 github.com/tidyverse/dplyr/commit/… এ
nacnudus

72

unlistআমি যা পড়তে সহজ মনে করি তা আপনিও ব্যবহার করতে পারেন কারণ আপনার কলামটির নামটি পুনরাবৃত্তি করার বা সূচি নির্দিষ্ট করার দরকার নেই।

iris2 %>% select(Species) %>% unlist(use.names = FALSE)

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

আমি কেবল এই সঠিক প্রশ্নের উত্তর খুঁজছিলাম এবং unlistআমার যা প্রয়োজন তা অবিকল। ধন্যবাদ!
অ্যান্ড্রু ব্রাজা

unlistdplyr::pullএকক কলামে সীমাবদ্ধ থাকাকালীন একাধিক কলাম (সমস্ত মানকে একক ভেক্টরের সাথে একত্রিত করে) থেকে মানও বের করতে পারে ।
ফাইলআপস

21

আমি extract2থেকে সুবিধামত কার্যটি ব্যবহার করব magrittr:

library(magrittr)
library(dplyr)

iris2 %>%
  select(Species) %>%
  extract2(1)  

আপনি ব্যবহার চাওয়ার কথা বলছেন কি collect()মধ্যে selectএবং extract2?
ন্যাকনডাস

10
use_series(Species)সম্ভবত আরও পাঠযোগ্য। এই ক্রিয়াকলাপ সম্পর্কে আমাকে সতর্ক করার জন্য ধন্যবাদ, অন্যান্য বেশ কয়েকটি সহজলভ্য জিনিসগুলি এসেছে যেখান থেকে এসেছে।
ন্যাকনডাস

20

আমি সম্ভবত লিখতে হবে:

collect(select(iris2, Species))[[1]]

যেহেতু ডিপি্লায়ার টিবিএলএস ডেটা নিয়ে কাজ করার জন্য ডিজাইন করা হয়েছে, তাই একক কলামের ডেটা পাওয়ার আরও ভাল উপায় নেই।


এর চেয়ে সুন্দর বলতে পারব না। কনসোলে ইন্টারেক্টিভভাবে উত্থিত হয়েছিল যখন আমি উদ্দীপক মানগুলি পরীক্ষা করার জন্য অনন্য (টেবিল $ কলাম) ব্যবহার করার চেষ্টা করেছি।
ন্যাকনডাস

4
যে ক্ষেত্রে আপনার কাছে যেত না জন্য @nacnudusgroup_by(column) %.% tally()
হ্যাডলি

12
একটি যুক্তি drop = TRUEকরার dplyr::selectবেশ অনেক ব্যবহারের ক্ষেত্রে যেখানে আমরা আসলে ভেক্টর বের করে আনতে প্রয়োজন জন্য আশ্চর্যজনক হবে।
এন্টোইন লিজি

এটি আমার স্পার্ক্ল্লার এসডিএফ থেকে কলামটি পাওয়া একমাত্র উপায়। টানুন আমার জন্য 0.7.8 সংস্করণে কাজ করছেন না।
মীপ

16

@ লুক 1018 মন্তব্যগুলির একটিতে এই সমাধানটির প্রস্তাব দিয়েছেন:

আপনি কোনও ডেটা ফ্রেম থেকে ভেক্টর টানতে magrittrএক্সপোজেশন অপারেটর ( %$%) ব্যবহার করতে পারেন ।

উদাহরণ স্বরূপ:

iris2 %>% select(Species) %>% collect() %$% Species

আমি ভেবেছিলাম এটির নিজস্ব উত্তর প্রাপ্য।


আমি এটা খুঁজছিলাম।
দিয়েগো-এমএক্স

আমি যদি এই নামটি নিজেই না করে নিজের একটি স্ট্রিং ভেরিয়েবলের মধ্যে থাকতে চাই তবে আমি কী করব?
মজুবা

@ এমজুবা tibble(x = 1:10, y = letters[1:10]) %>% select_("x") %>% unlist()এবং আপনি চাইলে %>% unname()শেষে আরও একটি যোগ করতে পারেন, তবে আমার উদ্দেশ্যগুলির জন্য আমি পাইপ চেইনের শেষ লিঙ্কটি প্রয়োজনীয় হতে পাইনি। এছাড়াও আপনি উল্লেখ করতে পারে use.names = FALSEমধ্যে unlist()কমান্ড, যা যোগ হিসাবে একই জিনিস আছে unname()নল শৃঙ্খল সম্মুখের।
মার্ক হোয়াইট

1
@ এমজুবা আমি pullএখনই কমান্ডটি ব্যবহার করব । আমার সমাধানটি dplyr0.6 সংস্করণের আগে লেখা হয়েছিল ।
rrs

1
নোট করুন যে %$%কোনও তালিকায় কাজ করে, যেখানে pull()নেই
wint3rschlaefer

2

আপনি যদি ইনডেক্সিংয়ের জন্য বর্গাকার বন্ধনীর ব্যবহার করতে অভ্যস্ত হন তবে অন্য বিকল্পটি হ'ল ডিফ্রেম () এর কলটিতে স্বাভাবিক সূচিকরণ পদ্ধতিটি আবৃত করা , যেমন:

library(tidyverse)

iris2 <- as_tibble(iris)

# using column name
deframe(iris2[, 'Sepal.Length'])

# [1] 5.1 4.9 4.7 4.6 5.0 5.4

# using column number
deframe(iris2[, 1])

# [1] 5.1 4.9 4.7 4.6 5.0 5.4

এটি এবং টান () উভয়ই একটি টিবল কলাম পাওয়ার খুব ভাল উপায়।

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