আমি কীভাবে একটি তালিকা থেকে কোনও উপাদান অপসারণ করতে পারি?


275

আমার একটি তালিকা আছে এবং আমি এটি থেকে একটি একক উপাদান অপসারণ করতে চাই। কিভাবে আমি এটি করতে পারব?

আমি এই ফাংশনটির সুস্পষ্ট নামগুলি রেফারেন্স ম্যানুয়ালটিতে কী হবে বলে আমি সন্ধান করার চেষ্টা করেছি এবং আমি উপযুক্ত কিছু পাই নি।


নির্ভর করে আপনি কী এটিকে "মান 5", বা সূচক / সূচকগুলি "সূচক 5 এর উপাদান" বা "সূচক সি (5: 6,10) দ্বারা মুছে ফেলতে চান? আপনি যদি মানটি দিয়ে এবং সেখানে সরাতে চান সদৃশ হয়, তবে আপনি কি কেবল নকলগুলি, প্রথম বা শেষ ঘটনাটি বা সমস্তগুলি সরাতে চান? তালিকায় আপনার উপাদান / সূচক রয়েছে তা কি গ্যারান্টিযুক্ত? তালিকাটি খালি রয়েছে এমন ক্ষেত্রে আমাদের কী পরিচালনা করতে হবে? আমাদের কি দরকার? এনএ পাস হয়েছে কিনা তা নিশ্চিত (/ বাদ)) তালিকাটি কি সমতল হওয়ার নিশ্চয়তা আছে বা এটি
বাসা বেঁধে দেওয়া

2
সেটডিফ (মাইলিস্ট, এলিমেন্টটোরোমোভ)
জেএসট্রাল

উত্তর:


218

আমি আর মোটেও জানি না, তবে কিছুটা সৃজনশীল গুগল আমাকে এখানে নিয়ে গেছে: http://tolstoy.newcastle.edu.au/R/help/05/04/1919.html

সেখান থেকে মূল উক্তি:

আমি তালিকা থেকে উপাদানগুলি কীভাবে সরিয়ে ফেলতে পারি তার জন্য আমি স্পষ্ট করে ডকুমেন্টেশন পাই না, তবে বিচার এবং ত্রুটি আমাকে বলে tells

মাইলিস্ট [[5]] <- নুল

5 তম উপাদানটি সরিয়ে ফেলবে এবং তারপরে সেই উপাদানটি মোছার ফলে সৃষ্ট গর্তটি "বন্ধ" করবে। এটি সূচকের মানগুলিকে ভোগ করে, সুতরাং উপাদানগুলি হ্রাস করার ক্ষেত্রে আমাকে সতর্কতা অবলম্বন করতে হবে। আমার অবশ্যই তালিকার পিছন থেকে সামনের দিকে কাজ করা উচিত।

থ্রেডে পরবর্তী পোস্টে একটি প্রতিক্রিয়া জানিয়েছে:

তালিকার কোনও উপাদান মোছার জন্য, আর এফএকিউ 7.1 দেখুন

এবং আর এফএকিউ এর সম্পর্কিত বিভাগটি বলে:

... x [i] বা x [[i]] কে NUL তে সেট করবেন না কারণ এটি তালিকা থেকে সংশ্লিষ্ট উপাদানটিকে সরিয়ে ফেলবে।

যা আপনাকে কিছুটা (কিছুটা পিছনের দিকে) বলবে বলে মনে হচ্ছে কীভাবে কোনও উপাদান অপসারণ করা যায়।

আশা করি যা সহায়তা করে বা কমপক্ষে আপনাকে সঠিক দিকে নিয়ে যায়।


5
ধন্যবাদ, মাইলিস্ট [i] <- NULL হ'ল এটি করার উপায়।
ডেভিড লক

37
এটি আমার পক্ষে কার্যকর হয়নি। আমি পেয়েছি:Error in list[length(list)] <- NULL : replacement has length zero
wfbarksdale

3
@ আলেকসান্দ্র লেভাককের পোস্ট আমাকে দেখিয়েছিল যে আমি আসলে কোনও ভেক্টরের সাথেই কাজ করছি এবং একটি নতুন অবজেক্ট তৈরি করা দরকার
wfbarksdale

209

আপনি যদি স্থানটি তালিকায় স্থান পরিবর্তন করতে না চান (যেমন কোনও ফাংশনে সরানো কোনও উপাদান দিয়ে তালিকাটি পাস করার জন্য), আপনি ইনডেক্সিং ব্যবহার করতে পারেন: নেতিবাচক সূচকগুলির অর্থ "এই উপাদানটি অন্তর্ভুক্ত করবেন না"।

x <- list("a", "b", "c", "d", "e"); # example list

x[-2];       # without 2nd element

x[-c(2, 3)]; # without 2nd and 3rd

এছাড়াও, লজিকাল ইনডেক্স ভেক্টরগুলি দরকারী:

x[x != "b"]; # without elements that are "b"

এটি ডেটাফ্রেমেও কাজ করে:

df <- data.frame(number = 1:5, name = letters[1:5])

df[df$name != "b", ];     # rows without "b"

df[df$number %% 2 == 1, ] # rows with odd numbers only

4
আপনার যৌক্তিক সূচকগুলি কেবল তখনই কাজ করে যদি আপনার কাছে তালিকার একটি উপাদানটিতে "বি" থাকে। আপনি সেভাবে মুছে ফেলতে পারবেন না, বলতে পারবেন না x$bবা তালিকার উপাদান থেকে আপনি "b" কে সরাতে পারবেন না x[[2]] = c("b","k")
কার্ল উইথফট

একক বনাম একাধিক আইটেম সম্পর্কিত: আপনি %in%একাধিক আইটেমের বিরুদ্ধে পরীক্ষার জন্য ব্যবহার করতে পারেন । আমি নিশ্চিত না যে আপনি "এক্স-বি মুছে ফেলতে পারবেন না" বলতে যা বোঝায় - আপনি কি পুরো কলামটি অপসারণ করতে চান b?
ফ্লোরিয়ান জেন

30

এখানে একটি তালিকার শেষ উপাদানটি কীভাবে সরানো হবে তা এখানে :

x <- list("a", "b", "c", "d", "e")
x[length(x)] <- NULL

যদি এক্স ভেক্টর হতে পারে তবে আপনাকে একটি নতুন অবজেক্ট তৈরি করতে হবে:

x <- c("a", "b", "c", "d", "e")
x <- x[-length(x)]
  • তালিকাগুলি এবং ভেক্টরগুলির জন্য কাজ করুন

@ কেআরএলএমএমএল: বিপরীতে, এই সমাধানটি ফ্লোরিয়ানের উত্তরের চেয়ে বেশি সাধারণ, কারণ এটি সংগ্রহের ধরণে বহুরূপী।
ড্যান বারোই

@ ড্যানবারোয়ে: আমি ভুল ছিলাম: এটি চাদের উত্তরের সংশ্লেষ বলে মনে হয়েছে (স্বীকৃত উত্তর) এবং ফ্লোরিয়ানের ... একটি সংক্ষিপ্ত সংক্ষিপ্তসার, যদিও।
krlmlr

19

একক লাইনের একটি তালিকা থেকে নাল উপাদানগুলি সরানো:

x=x[-(which(sapply(x,is.null),arr.ind=TRUE))]

চিয়ার্স


2
এই কোডটি xখালি তালিকায় গেলে ব্রেক হয়। পরিবর্তে এই কাজের জন্য compactথেকে plyrব্যবহার করুন ।
রিচি কটন

এছাড়াও যদি তালিকায় কোনও শূন্য না থাকে, -(which(sapply(x,is.null),arr.ind=TRUE))রিটার্নগুলি named integer(0)যা পুরো সারিটি ফেলে দেবে।
ব্যবহারকারী 3055034

17

আমি এটি যুক্ত করতে চাই যদি এটি একটি নামযুক্ত তালিকা হয় তবে আপনি কেবল ব্যবহার করতে পারেন within

l <- list(a = 1, b = 2)    
> within(l, rm(a))
$b
[1] 2

সুতরাং আপনি মূল তালিকাটি ওভাররাইট করতে পারেন

l <- within(l, rm(a)) 

aতালিকা থেকে নামকরণ উপাদান অপসারণ l


1
একাধিক করতেwithin(l, rm(a, b))
ভ্লাদ

16

আপনার যদি একটি নামযুক্ত তালিকা থাকে এবং একটি নির্দিষ্ট উপাদান মুছতে চান তবে আপনি চেষ্টা করতে পারেন:

lst <- list(a = 1:4, b = 4:8, c = 8:10)

if("b" %in% names(lst)) lst <- lst[ - which(names(lst) == "b")]

এই তালিকা করতে হবে lstউপাদানের সঙ্গে a, b, c। দ্বিতীয় লাইনটি bএটি উপস্থিত রয়েছে কিনা যাচাই করার পরে উপাদানটিকে সরিয়ে দেয় (@jjv উল্লিখিত সমস্যা এড়াতে)।

বা আরও ভাল:

lst$b <- NULL

এইভাবে কোনও অস্তিত্বের উপাদান (উদাঃ lst$g <- NULL) মুছে ফেলার চেষ্টা করা কোনও সমস্যা নয়


10

বিভিন্ন ধরণের তালিকার ক্রিয়াকলাপ মোকাবেলার জন্য তালিকাভুক্ত প্যাকেজ রয়েছে ( http://cran.r-project.org/web/packages/rlist/index.html )।

উদাহরণ ( http://cran.r-project.org/web/packages/rlist/vignettes/Filtering.html ):

library(rlist)
devs <- 
  list(
    p1=list(name="Ken",age=24,
      interest=c("reading","music","movies"),
      lang=list(r=2,csharp=4,python=3)),
    p2=list(name="James",age=25,
      interest=c("sports","music"),
      lang=list(r=3,java=2,cpp=5)),
    p3=list(name="Penny",age=24,
      interest=c("movies","reading"),
      lang=list(r=1,cpp=4,python=2)))

list.remove(devs, c("p1","p2"))

ফলাফল স্বরূপ:

# $p3
# $p3$name
# [1] "Penny"
# 
# $p3$age
# [1] 24
# 
# $p3$interest
# [1] "movies"  "reading"
# 
# $p3$lang
# $p3$lang$r
# [1] 1
# 
# $p3$lang$cpp
# [1] 4
# 
# $p3$lang$python
# [1] 2

এই উদাহরণে একজন কীভাবে অজগর বা ল্যাং আইটেমগুলি সরিয়ে ফেলতে পারে?
আর্থার ইপ

9

আপনার এখনও এর জবাব দরকার কিনা তা জানেন না তবে আমি আমার সীমিত (3 সপ্তাহের স্ব-শিক্ষাদানের মূল্য) এর অভিজ্ঞতা পেয়েছি যে, NULLঅ্যাসাইনমেন্টটি ব্যবহার করা আসলে ভুল বা উপ-অনুকূল, বিশেষত যদি আপনি গতিশীলভাবে আপডেট করছেন ফর-লুপের মতো কিছুতে একটি তালিকা।

আরও সুনির্দিষ্ট হতে, ব্যবহার করে

myList[[5]] <- NULL

ত্রুটি নিক্ষেপ করবে

মাইলিস্ট [[৫]] <- নুল: প্রতিস্থাপনের দৈর্ঘ্য শূন্য

অথবা

প্রতিস্থাপনের চেয়ে সরবরাহিত আরও উপাদান

আমি আরও ধারাবাহিকভাবে কাজ করতে যা পেয়েছি তা হ'ল

myList <- myList[[-5]]

1
ভাল উত্তর! যাইহোক, আমি মনে করি [[-5]]একক বর্গাকার বন্ধনী হওয়া উচিত, অন্যথায় আপনি কেবলমাত্র তালিকার উপাদানটির বিষয়বস্তুগুলি অনির্বাচিত করছেন, উপাদানটি নিজেই নয়। ভাল, কমপক্ষে ডাবল স্কোয়ার বন্ধনী ব্যবহার করা আমাকে এই ত্রুটি দেয়: "একাধিক উপাদান নির্বাচন করার চেষ্টা"। আমার জন্য কি কাজ তারপর ছিল: myList <- myList[-5]
n1k31t4

4

কেবলমাত্র দ্রুত যুক্ত করতে চেয়েছিলেন (কারণ আমি এটি কোনও উত্তরের মধ্যে দেখতে পাইনি), একটি নামের তালিকার জন্য আপনিও এটি করতে পারেন l["name"] <- NULL। উদাহরণ স্বরূপ:

l <- list(a = 1, b = 2, cc = 3)
l['b'] <- NULL

4

-উপাদানের অবস্থানের সাথে (নেতিবাচক চিহ্ন) ব্যবহার করুন , উদাহরণস্বরূপ, যদি তৃতীয় উপাদানটি অপসারণ করা হয় তবে এটি ব্যবহার করুনyour_list[-3]

ইনপুট

my_list <- list(a = 3, b = 3, c = 4, d = "Hello", e = NA)
my_list
# $`a`
# [1] 3

# $b
# [1] 3

# $c
# [1] 4

# $d
# [1] "Hello"

# $e
# [1] NA

তালিকা থেকে একক উপাদান সরান

 my_list[-3]
 # $`a`
 # [1] 3

 # $b
 # [1] 3

 # $d
 # [1] "Hello"

 # $e
 [1] NA

তালিকা থেকে একাধিক উপাদান সরান

 my_list[c(-1,-3,-2)]
 # $`d`
 # [1] "Hello"

 # $e
 # [1] NA

 my_list[c(-3:-5)]
 # $`a`
 # [1] 3

 # $b
 # [1] 3

 my_list[-seq(1:2)]
 # $`c`
 # [1] 4

 # $d
 # [1] "Hello"

 # $e
 # [1] NA

2

নামযুক্ত তালিকার ক্ষেত্রে আমি সেই সাহায্যকারী ফাংশনগুলি দরকারী বলে মনে করি

member <- function(list,names){
    ## return the elements of the list with the input names
    member..names <- names(list)
    index <- which(member..names %in% names)
    list[index]    
}


exclude <- function(list,names){
     ## return the elements of the list not belonging to names
     member..names <- names(list)
     index <- which(!(member..names %in% names))
    list[index]    
}  
aa <- structure(list(a = 1:10, b = 4:5, fruits = c("apple", "orange"
)), .Names = c("a", "b", "fruits"))

> aa
## $a
##  [1]  1  2  3  4  5  6  7  8  9 10

## $b
## [1] 4 5

## $fruits
## [1] "apple"  "orange"


> member(aa,"fruits")
## $fruits
## [1] "apple"  "orange"


> exclude(aa,"fruits")
## $a
##  [1]  1  2  3  4  5  6  7  8  9 10

## $b
## [1] 4 5

0

ল্যাপলি এবং গ্রেপ ব্যবহার:

lst <- list(a = 1:4, b = 4:8, c = 8:10)
# say you want to remove a and c
toremove<-c("a","c")
lstnew<-lst[-unlist(lapply(toremove, function(x) grep(x, names(lst)) ) ) ]
#or
pattern<-"a|c"
lstnew<-lst[-grep(pattern, names(lst))]

-1

এ কেমন? আবার সূচকগুলি ব্যবহার করে

> m <- c(1:5)
> m
[1] 1 2 3 4 5

> m[1:length(m)-1]
[1] 1 2 3 4

অথবা

> m[-(length(m))]
[1] 1 2 3 4

1
মি একটি ভেক্টর, কোনও তালিকা নয়
C8H10N4O2

1
পদ্ধতি তালিকাগুলির জন্য কাজ করে তবে ওপি ভাগ্যবান এবং সম্ভবত আরও কিছু প্রথম বন্ধনী চায়:m[1:(length(m) - 1)]
গ্রেগর টমাস

-1

আপনি যদি সংখ্যার সূচকগুলি এড়াতে চান তবে আপনি এটি ব্যবহার করতে পারেন

a <- setdiff(names(a),c("name1", ..., "namen"))

namea...namenএকটি থেকে নাম মুছতে । এটি তালিকার জন্য কাজ করে

> l <- list(a=1,b=2)
> l[setdiff(names(l),"a")]
$b
[1] 2

পাশাপাশি ভেক্টরদের জন্যও

> v <- c(a=1,b=2)
> v[setdiff(names(v),"a")]
b 
2

-2

আপনি ব্যবহার করতে পারেন which

x<-c(1:5)
x
#[1] 1 2 3 4 5
x<-x[-which(x==4)]
x
#[1] 1 2 3 5

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