2015-05-08 16 views
6

tôi có rất nhiều các danh sách đó giống như thế nàyThay đổi danh sách các mục để tên R

:List of 73 
..$ :List of 2 
.. ..$: chr "aaaa" 
.. ..$: num 2 
..$ :List of 2 
.. ..$: chr "cccc" 
.. ..$: num 7 
..$ :List of 2 
.. ..$: chr "dddd" 
.. ..$: num 5 
..$ :List of 2 
.. ..$: chr "bbbb" 
.. ..$: num 6 

vân vân cho 73 lần

Vì vậy, có 73 danh sách trong danh sách. Và mỗi phần của các danh sách đó chứa hai mục. Nhưng trên thực tế nó là một mục và mục thứ hai là giá trị. Làm thế nào tôi có thể thay đổi danh sách một cách tự động để nó trông giống như sau:

:List of 73 
$ aaaa: num 2 
$ cccc: num 7 
$ dddd: num 5 
$ bbbb: num 6 

vân vân cho 73 lần

tôi có rất nhiều các danh sách tìm kiếm như thế này, nhưng mỗi lần "aaaa "ở một nơi khác, vì vậy việc thay đổi thủ công rất tốn thời gian.

Trả lời

6

Đối với mỗi thành phần x của mylist, bạn có thể truy cập danh sách con đầu tiên với x[[1]]; và thứ hai với x[[2]]. Hàm này cũng có thể được gọi là `[[`(x,i) trong đó i là số lượng danh sách phụ.

mylist <- list(list("aa",2),list("cc",7)) 
str(mylist) 
# List of 2 
# $ :List of 2 
# ..$ : chr "aa" 
# ..$ : num 2 
# $ :List of 2 
# ..$ : chr "cc" 
# ..$ : num 7 
mynewlist <- setNames(lapply(mylist,`[[`,2),sapply(mylist,`[[`,1)) 
str(mynewlist) 
# List of 2 
# $ aa: num 2 
# $ cc: num 7 

setNames(x,xnames) chỉ trả x với các yếu tố của nó được dán nhãn với xnames.


Không sử dụng danh sách. Bạn có lẽ không cần một list và có thể làm việc với một véc tơ, mà là đơn giản:

  • Trong câu trả lời của tôi, chuyển đổi các lapply-sapply.
  • Trong ColonelBeauvel, hãy xóa cuộc gọi as.list.

Truy cập vào phần tử của nó bằng tên riêng là khá trực quan:

myvec <- setNames(sapply(mylist,`[[`,2),sapply(mylist,`[[`,1)) 
myvec["aa"] 
# aa 
# 2 
+0

Làm việc hoàn hảo! Cảm ơn!!! – Gianni

+1

@Gianni Rất vui khi được nghe! Chỉ cần thêm một phần vào câu trả lời như bạn đã bình luận - bạn có thể muốn xem xét sử dụng một vector có tên. – Frank

+0

@Gianni, nếu điều này giải quyết được vấn đề của bạn, vui lòng xem xét chấp nhận vấn đề bằng cách nhấp vào dấu kiểm ở bên trái bên dưới tổng số phiếu bầu. – gung

1

Tôi thà sử dụng một cách tiếp cận mà không lapply. Nếu lst là ban đầu của bạn list:

x = unlist(lst) 
setNames(as.list(as.numeric(x[seq(2, length(x),2)])),x[seq(1, length(x),2)]) 

#$aaaa 
#[1] 2 

#$cccc 
#[1] 7 

dữ liệu:

lst=list(list('aaaa',2), list('cccc',7)) 
Các vấn đề liên quan