আর-তে খালি ভেক্টরের মান যুক্ত করুন?


160

আমি আর শিখার চেষ্টা করছি এবং কীভাবে তালিকায় যুক্ত হবে তা আমি বুঝতে পারি না।

এটি যদি পাইথন হত আমি। । ।

#Python
vector = []
values = ['a','b','c','d','e','f','g']

for i in range(0,len(values)):
    vector.append(values[i])

আপনি আর এ কিভাবে করবেন?

#R Programming
> vector = c()
> values = c('a','b','c','d','e','f','g')
> for (i in 1:length(values))
+ #append value[i] to empty vector

কেবল স্পষ্টতার স্বার্থে, অজগরটিতে আপনি কীভাবে এটি করতেন তা নয়, অন্তত যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি। আপনি সহজভাবে করতে পারে vector = values; অথবা আপনি ভেক্টর = ভেক্টর + মানগুলি করতে পারেন। তবে আমি আপনার ব্যবহারের ক্ষেত্রে ভুল বোঝাবুঝি করছি
ব্যক্তিগত

উত্তর:


209

লুপের জন্য কোনও বস্তুর সাথে যুক্ত হওয়ার কারণে প্রতিটি পুনরাবৃত্তিতে পুরো বস্তুটি অনুলিপি হয়, যার ফলে প্রচুর লোক "আর ধীর" বলে বা "আর লুপগুলি এড়ানো উচিত" বলে তোলে।

ব্রোডিজি মন্তব্যগুলিতে যেমন উল্লেখ করেছেন: পছন্দসই দৈর্ঘ্যের কোনও ভেক্টরকে প্রাক-বরাদ্দ করা আরও ভাল, তারপরে উপাদানটির মানগুলি লুপে সেট করুন।

এখানে কোনও ভেক্টরকে মান যুক্ত করার বিভিন্ন উপায় রয়েছে। তারা সকলেই নিরুৎসাহিত হন।

একটি লুপে একটি ভেক্টরের সাথে যুক্ত

# one way
for (i in 1:length(values))
  vector[i] <- values[i]
# another way
for (i in 1:length(values))
  vector <- c(vector, values[i])
# yet another way?!?
for (v in values)
  vector <- c(vector, v)
# ... more ways

help("append")আপনার প্রশ্নের উত্তরটি দিত এবং এই প্রশ্নটি লেখার জন্য আপনাকে যে সময়টি দিয়েছিল তা বাঁচাতে পারত (তবে আপনাকে খারাপ অভ্যাস গড়ে তুলতে পারে)। ;-)

নোট করুন যে vector <- c()খালি ভেক্টর নয়; এটা NULL। আপনি যদি খালি চরিত্রের ভেক্টর চান তবে ব্যবহার করুন vector <- character()

লুপিংয়ের আগে ভেক্টরকে প্রাক-বরাদ্দ করুন

যদি আপনাকে অবশ্যই লুপের জন্য একটি ব্যবহার করতে হয় তবে আপনাকে লুপের আগে পুরো ভেক্টরকে প্রাক-বরাদ্দ দেওয়া উচিত। বৃহত্তর ভেক্টর সংযোজনের চেয়ে এটি আরও দ্রুত হবে।

set.seed(21)
values <- sample(letters, 1e4, TRUE)
vector <- character(0)
# slow
system.time( for (i in 1:length(values)) vector[i] <- values[i] )
#   user  system elapsed 
#  0.340   0.000   0.343 
vector <- character(length(values))
# fast(er)
system.time( for (i in 1:length(values)) vector[i] <- values[i] )
#   user  system elapsed 
#  0.024   0.000   0.023 

2
আমি এটি চেষ্টা করেছিলাম কিন্তু আমি যখন একটি
নকল

6
অদক্ষতা সম্পর্কে স্মরণ করিয়ে দেওয়ার জন্য +1, তবে কীভাবে ( vector <- character(length(values)); for(...) কাজ করবেন তার বিশদ যুক্ত করতে পারেন ?
ব্রোডিজি

20
যদি সবাইকে নিরুৎসাহিত করা হয় তবে পরিবর্তে কী উত্সাহিত হয়েছে তা হাইলাইট করা ভাল হবে কারণ এটি মোটামুটি সাধারণ প্যাটার্ন।
বাক্সেক্স

এই মুহুর্তে, দুর্দান্ত বই "আর ইনফারনো
স্ট্যাট.

62

এফডাব্লুআইডাব্লু: পাইথনের সংযোজন ():

b <- 1
b <- c(b, 2)

8
রয়েছে পরিশেষে যোগ () আর এ হিসেবে ব্যবহার করা হবে: b <- 1; b <- append(b, 2)। তবে আপনি যেমন উল্লেখ করেছেন, গ () হ'ল জিনিসগুলি করার একটি আরও বেশি উপায়।
janbretti

31

আপনার স্বল্প কিছু সু্যোগ আছে:

  • c(vector, values)

  • append(vector, values)

  • vector[(length(vector) + 1):(length(vector) + length(values))] <- values

প্রথমটি হ'ল মানক পদ্ধতির। দ্বিতীয়টি আপনাকে শেষ ছাড়া অন্য কোথাও যুক্ত করার বিকল্প দেয় option শেষটি কিছুটা সংকোচিত তবে পরিবর্তনের সুবিধা রয়েছে vector(যদিও সত্যই, আপনি ঠিক তত সহজেই করতে পারেন vector <- c(vector, values)

লক্ষ্য করুন যে আর-তে আপনাকে ভেক্টরগুলির মাধ্যমে চক্রের দরকার নেই। আপনি কেবল তাদের উপর সম্পূর্ণ পরিচালনা করতে পারেন।

এছাড়াও, এটি মোটামুটি বেসিক স্টাফ, তাই আপনার কয়েকটি উল্লেখের মধ্য দিয়ে যাওয়া উচিত ।

ওপি মতামতের ভিত্তিতে আরও কিছু বিকল্প:

for(i in values) vector <- c(vector, i)

আমি কিছুটা জটিল কিছু করছি আমাকে এগুলি লুপের মাধ্যমে সংযুক্ত করা দরকার কারণ আমি তাদের সংশোধন করছি
ওআরকা

1
@ draconisthe0ry, আপনি যা করার চেষ্টা করছেন সে সম্পর্কে আপনি আরও বিশদ সরবরাহ করবেন না কেন?
ব্রোডিজি

1
আচ্ছা বুঝলাম! লুপের জন্য সি (ভেক্টর, মানগুলি [i]) করার পরিবর্তে আপনাকে "ভেক্টর = সি (ভেক্টর, মানগুলি [i]) করতে হবে
ও.আরকা

আমি cভেক্টরের পরিবর্তে ডেটাফ্রেম যোগ করতে ব্যবহার করতে চাই ?
loretoparisi

18

কেবল সম্পূর্ণতার জন্য, লুপের জন্য কোনও ভেক্টরের সাথে মান সংযোজন করা আর-র মধ্যে দর্শন আসলেই নয় R আপনার কোডটি আবার লিখতে পারা যায় না তা দেখুন:

ouput <- sapply(values, function(v) return(2*v))

আউটপুট ফেরত মানগুলির একটি ভেক্টর হবে। lapplyমানগুলি যদি কোনও ভেক্টরের পরিবর্তে একটি তালিকা হয় তবে আপনি এটিও ব্যবহার করতে পারেন।


8

কখনও কখনও আমাদের লুপগুলি ব্যবহার করতে হয়, উদাহরণস্বরূপ, যখন আমরা জানি না যে ফলাফলটি পেতে আমাদের কতগুলি পুনরাবৃত্তি প্রয়োজন। উদাহরণস্বরূপ লুপগুলি গ্রহণ করুন। নীচে আপনার নিখুঁত উপায়গুলি এড়ানো উচিত:

a=numeric(0)
b=1
system.time(
  {
    while(b<=1e5){
      b=b+1
      a<-c(a,pi)
    }
  }
)
# user  system elapsed 
# 13.2     0.0    13.2 

a=numeric(0)
b=1
system.time(
  {
    while(b<=1e5){
      b=b+1
      a<-append(a,pi)
    }
  }
)
# user  system elapsed 
# 11.06    5.72   16.84 

এগুলি খুব অযোগ্য, কারণ প্রতিবার ভেক্টরটি এটি সংযুক্ত করার সাথে অনুলিপি করে।

সংযোজনের সবচেয়ে কার্যকরী উপায় হ'ল সূচি ব্যবহার করা। নোট করুন যে এবার আমি এটি 1e7 বার পুনরাবৃত্তি করতে দিয়েছি, তবে এটি এখনও এর চেয়ে অনেক দ্রুত c

a=numeric(0)
system.time(
  {
    while(length(a)<1e7){
      a[length(a)+1]=pi
    }
  }
)
# user  system elapsed 
# 5.71    0.39    6.12  

এটি গ্রহণযোগ্য। এবং আমরা তা প্রতিস্থাপন একটু দ্রুততর করতে পারেন [সঙ্গে [[

a=numeric(0)
system.time(
  {
    while(length(a)<1e7){
      a[[length(a)+1]]=pi
    }
  }
)
# user  system elapsed 
# 5.29    0.38    5.69   

হতে পারে আপনি ইতিমধ্যে লক্ষ্য করেছেন যে lengthসময় সাপেক্ষ হতে পারে। আমরা যদি lengthকাউন্টার দিয়ে প্রতিস্থাপন করি :

a=numeric(0)
b=1
system.time(
  {
    while(b<=1e7){
      a[[b]]=pi
      b=b+1
    }
  }
)
# user  system elapsed 
# 3.35    0.41    3.76

অন্য ব্যবহারকারীরা যেমন উল্লেখ করেছেন, ভেক্টরকে প্রাক-বরাদ্দ করা খুব সহায়ক। তবে গতি এবং মেমরির ব্যবহারের মধ্যে এটি একটি বাণিজ্য is

a=rep(NaN,2*1e7)
b=1
system.time(
  {
    while(b<=1e7){
      a[[b]]=pi
      b=b+1
    }
    a=a[!is.na(a)]
  }
)
# user  system elapsed 
# 1.57    0.06    1.63 

একটি মধ্যবর্তী পদ্ধতি হ'ল ধীরে ধীরে ফলাফলের ব্লক যুক্ত করা।

a=numeric(0)
b=0
step_count=0
step=1e6
system.time(
  {
    repeat{
      a_step=rep(NaN,step)
      for(i in seq_len(step)){
        b=b+1
        a_step[[i]]=pi
        if(b>=1e7){
          a_step=a_step[1:i]
          break
        }
      }
      a[(step_count*step+1):b]=a_step
      if(b>=1e7) break
      step_count=step_count+1
    }
  }
)
#user  system elapsed 
#1.71    0.17    1.89

2

আর এ, আপনি এইভাবে চেষ্টা করে দেখতে পারেন:

X = NULL
X
# NULL
values = letters[1:10]
values
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
X = append(X,values)
X
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
X = append(X,letters[23:26])
X
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "w" "x" "y" "z"

2
> vec <- c(letters[1:3]) # vec <- c("a","b","c") ; or just empty vector: vec <- c()

> values<- c(1,2,3)

> for (i in 1:length(values)){
      print(paste("length of vec", length(vec))); 
      vec[length(vec)+1] <- values[i]  #Appends value at the end of vector
  }

[1] "length of vec 3"
[1] "length of vec 4"
[1] "length of vec 5"

> vec
[1] "a" "b" "c" "1" "2" "3"

0

আপনি অজগর কোডটিতে যা ব্যবহার করছেন সেটিকে পাইথনের তালিকা বলা হয়, এবং এটি আর ভেক্টরগুলির থেকে আলাদা হয়, যদি আপনি যা করতে চান তবে আমি তা পাই:

# you can do like this if you'll put them manually  
v <- c("a", "b", "c")

# if your values are in a list 
v <- as.vector(your_list)

# if you just need to append
v <- append(v, value, after=length(v))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.