ডেটা ফ্রেম কলামকে একটি ভেক্টরে রূপান্তর করবেন?


162

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

a1 = c(1, 2, 3, 4, 5)
a2 = c(6, 7, 8, 9, 10)
a3 = c(11, 12, 13, 14, 15)
aframe = data.frame(a1, a2, a3)

আমি নীচের একটি কলামকে ভেক্টরে রূপান্তরিত করার চেষ্টা করেছি, তবে এটি কার্যকর হয় না:

avector <- as.vector(aframe['a2'])
class(avector) 
[1] "data.frame"

এটিই আমি সমাধান করতে পেরেছি তবে আমি ধরে নিচ্ছি এটি করার একটি আরও ভাল উপায় থাকতে হবে:

class(aframe['a2']) 
[1] "data.frame"
avector = c()
for(atmp in aframe['a2']) { avector <- atmp }
class(avector)
[1] "numeric"

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


5
আপনি উত্তরগুলিতে যেমন দেখছেন, একটি নিবিড় পাঠ ?'[.data.frame'আপনাকে খুব দূরে নিয়ে যাবে।
জোরান

উত্তর:


207

আমি কোনও ভুল না করে এটি ব্যাখ্যা করার চেষ্টা করতে যাচ্ছি, তবে আমি বাজি ধরছি এটি মন্তব্যগুলিতে একটি বা দুটি ব্যাখ্যা আকর্ষণ করবে।

একটি ডেটা ফ্রেম একটি তালিকা। যখন আপনি কোনও কলামের নাম ব্যবহার করে ডেটা ফ্রেমটি সাবসেট করেন এবং [আপনি কী পান তা সাবলিস্ট (বা একটি উপ ডেটা ফ্রেম)। আপনি যদি সত্যিকারের পারমাণবিক কলামটি চান, আপনি ব্যবহার করতে পারেন [[বা কিছুটা বিভ্রান্তিকরভাবে (আমার কাছে) আপনি করতে পারেন aframe[,2]যা কোনও ভেক্টরকে ফেরত দেয়, সাবলিস্ট নয়।

সুতরাং এই ক্রমটি চালানোর চেষ্টা করুন এবং সম্ভবত বিষয়গুলি আরও পরিষ্কার হবে:

avector <- as.vector(aframe['a2'])
class(avector) 

avector <- aframe[['a2']]
class(avector)

avector <- aframe[,2]
class(avector)

6
+1 এটি দরকারী। aframe[,"a2"]ডেটা ফ্রেম এবং ম্যাট্রিক্স উভয় দিয়েই এটি ব্যবহার করার সক্ষমতা বলে আমি ব্যবহার করতে অভ্যস্ত হয়েছি এবং একই ফলাফল - মনে হয় ভেক্টর a
Iterator

8
[..., drop = F]সর্বদা ডেটা ফ্রেম ফিরিয়ে দেবে
হ্যাডলি

1
এটি বিশেষত জেনে রাখা ভাল কারণ df$xসিনট্যাক্সটি ভেক্টরকে ফিরিয়ে দেয়। আমি এই সিনট্যাক্সটি দীর্ঘকাল ব্যবহার করেছি, তবে যখন কলামগুলি ব্যবহার করতে df['name']বা df[n]পুনরুদ্ধার করতে হয়েছিল তখন আমি সমস্যার মুখোমুখি হয়েছি যখন আমি তাদের প্রত্যাশিত ভেক্টরগুলিতে ফাংশনে প্রেরণ করার চেষ্টা করেছি। এখনই জিনিসগুলি ব্যবহার df[[n]]বা df[['x']]সাফ করা।
রেঞ্জা

8
as.vectorনিঃশব্দে কেন কোনও প্রভাব নেই বলে মনে হচ্ছে? এটি কি কোনও ভেক্টরকে ফেরত দেবে না বা সুস্পষ্টভাবে ব্যর্থ হবে না?
bli

aframe[['a2']]sfবস্তুর সাথে খুব দরকারী কারণ aframe[,"a2"]দুটি কলাম ফিরে আসবে কারণ জ্যামিতি কলাম অন্তর্ভুক্ত রয়েছে।
ম্যাট


32

আপনি $নিষ্কাশন ব্যবহার করতে পারেন :

class(aframe$a1)
[1] "numeric"

বা ডাবল বর্গাকার বন্ধনী:

class(aframe[["a1"]])
[1] "numeric"

21

আপনার দরকার নেই as.vector(), তবে আপনার সঠিক ইনডেক্সিং দরকার:avector <- aframe[ , "a2"]

আর একটি বিষয় সম্পর্কে সচেতন হওয়ার drop=FALSEবিকল্পটি হ'ল [:

R> aframe <- data.frame(a1=c1:5, a2=6:10, a3=11:15)
R> aframe
  a1 a2 a3
1  1  6 11
2  2  7 12
3  3  8 13
4  4  9 14
5  5 10 15
R> avector <- aframe[, "a2"]
R> avector
[1]  6  7  8  9 10
R> avector <- aframe[, "a2", drop=FALSE]
R> avector
  a2
1  6
2  7
3  8
4  9
5 10
R> 

4
+1: অনুস্মারকটি drop=FALSEদরকারী - এটি আমাকে এমন ক্ষেত্রে ক্ষেত্রে সহায়তা করে যেখানে আমি কোনও ডেটা.ফ্রেম থেকে এন কলাম নির্বাচন করতে পারি, সেই ক্ষেত্রে যেখানে এন = 1।
Iterator

আমি এটি ব্যবহার করি যখন আমি নির্বাচিত কলামগুলির সংখ্যা জানতে পারি না এবং যদি একটি কলাম আসে তবে ফলাফলটি এখনও কলামের সাথে ডেটা ফ্রেম হিসাবে পাস হবে। কোনও ভেক্টর একটি বাঁদরের রেঞ্চটি লাইনের নীচে ফাংশনগুলিতে ফেলে দিতে পারে।
রোমান Luštrik

11

'[[' অপারেটরটি ব্যবহার করার আরেকটি সুবিধা হ'ল এটি ডেটাফ্রেম এবং ডেটা.টিটেবল উভয়ই কাজ করে। সুতরাং যদি ফাংশনটি ডেটা.ফ্রেম এবং ডেটা.ট্যাবল উভয়ের জন্যই চলমান করতে হয় এবং আপনি এটির থেকে কোনও কলামটি ভেক্টর হিসাবে বের করতে চান তবে

data[["column_name"]] 

ভাল.


8

আপনি এর মতো কিছু চেষ্টা করতে পারেন-

as.vector(unlist(aframe$a2))

আপনি যদি দুটি কলাম ব্যবহার করে তুলনা করতে চান তবে এটি ভাল identical
পি-রোবট

5

আপনি যদি কেবল এক্সট্রাক্ট অপারেটর ব্যবহার করেন তবে এটি কাজ করবে। ডিফল্টরূপে, [] বিকল্পগুলি সেট করে drop=TRUEযা আপনি এখানে চান want দেখুন ?'['আরো বিস্তারিত জানার জন্য।

>  a1 = c(1, 2, 3, 4, 5)
>  a2 = c(6, 7, 8, 9, 10)
>  a3 = c(11, 12, 13, 14, 15)
>  aframe = data.frame(a1, a2, a3)
> aframe[,'a2']
[1]  6  7  8  9 10
> class(aframe[,'a2'])
[1] "numeric"


3
a1 = c(1, 2, 3, 4, 5)
a2 = c(6, 7, 8, 9, 10)
a3 = c(11, 12, 13, 14, 15)
aframe = data.frame(a1, a2, a3)
avector <- as.vector(aframe['a2'])

avector<-unlist(avector)
#this will return a vector of type "integer"

2

আমি তালিকাতে ডাটাফ্রেমগুলি ফিল্টার করতে তালিকা ব্যবহার করি কিনা তাদের তালিকায়% এর একটি মান আছে কিনা।

আমি ম্যানুয়ালি একটি এক্স কলামে 1 কলামের ডেটাফ্রেম রফতানি করে তালিকা তৈরি করেছিলাম যেখানে আমি প্রতিটি উপাদান জুড়ে "" যোগ করব, আর-তে তালিকাভুক্ত করার আগে: তালিকা <- সি ("এল 1", "এল 2", ...) যা সাধারণত ছিল এর পরে ফিল্টারডেটা <- সাবসেট (ডেটা,% তালিকায় কলাম%) রয়েছে।

স্ট্যাকওভারফ্লো অনুসন্ধান করে এবং 1 টি কলামের ডেটাফ্রেমকে একটি তালিকায় রূপান্তর করার কোনও স্বজ্ঞাত উপায় না পেয়ে আমি এখন আমার প্রথম স্ট্যাকওভারফ্লো অবদান পোস্ট করছি:

# assuming you have a 1 column dataframe called "df"
list <- c()
for(i in 1:nrow(df)){
  list <- append(list, df[i,1])
}
View(list)
# This list is not a dataframe, it is a list of values
# You can filter a dataframe using "subset([Data], [Column] %in% list")

1

আমরা ডেটা.ফ্রেম কলামগুলি সাধারণ ভেক্টরে সাধারণভাবে রূপান্তর করতে পারি। as.vectorএটি ডেটা.ফ্রেম শ্রেণি এবং কাঠামো ধরে রাখার জন্য যথেষ্ট নয়, সুতরাং আমাদের প্রথম (এবং কেবল) উপাদানটিও বের করতে হবে:

df_column_object <- aframe[,2]
simple_column <- df_column_object[[1]]

এখন পর্যন্ত প্রস্তাবিত সমস্ত সমাধানগুলির জন্য হার্ডকোডিং কলামের শিরোনাম প্রয়োজন। এটি তাদের অ-জেনেরিক করে তোলে (এটি আর্গুমেন্টগুলিতে প্রয়োগ করার কথা ভাবুন)।

বিকল্পভাবে, আপনি অবশ্যই প্রথমে কলামটি থেকে কলামের নামগুলি পড়তে পারেন এবং তারপরে অন্যান্য সমাধানগুলিতে সেগুলিতে সন্নিবেশ করতে পারেন।

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