2012-09-30 48 views
20

tôi có một danh sách trong R với các yếu tố sau:Làm thế nào để trích xuất các phần tử từ một danh sách với các yếu tố hỗn hợp

[[812]] 
[1] ""    "668"   "12345_s_at" "667"   "4.899777748" 
[6] "49.53333333" "10.10930207" "1.598228663" "5.087437057" 

[[813]] 
[1] ""   "376"   "6789_at" "375"   "4.899655078" 
[6] "136.3333333" "27.82508792" "2.20223398" "5.087437057" 

[[814]] 
[1] ""    "19265"  "12351_s_at" "19264"  "4.897730912" 
[6] "889.3666667" "181.5874908" "1.846451572" "5.087437057" 

Tôi biết tôi có thể truy cập chúng với một cái gì đó giống như list_elem[[814]][3] trong trường hợp mà tôi muốn trích xuất thứ ba phần tử của vị trí 814. Tôi cần trích xuất phần tử thứ ba của tất cả danh sách, ví dụ 12345_s_at và tôi muốn đặt chúng trong một vectơ hoặc danh sách để tôi có thể so sánh các phần tử của chúng với danh sách khác sau này. Dưới đây là mã của tôi:

elem<-(c(listdata)) 
lp<-length(elem) 
for (i in 1:lp) 
{ 
    newlist<-c(listdata[[i]][3]) ###maybe to put in a vector 
    print(newlist) 
} 

Khi tôi in kết quả tôi nhận được yếu tố thứ ba, nhưng như thế này:

[1] "1417365_a_at" 
    [1] "1416336_s_at" 
    [1] "1416044_at" 
    [1] "1451201_s_at" 

vì vậy tôi không thể đi qua chúng với một chỉ số như newlist[3], bởi vì nó sẽ trả về NA. Sai lầm của tôi đâu rồi?

Trả lời

33

Nếu bạn muốn trích xuất các yếu tố thứ ba của mỗi phần tử danh sách bạn có thể làm:

List <- list(c(1:3), c(4:6), c(7:9)) 
lapply(List, '[[', 3) # This returns a list with only the third element 
unlist(lapply(List, '[[', 3)) # This returns a vector with the third element 

Sử dụng ví dụ của bạn và có tính đến @GSee bình luận bạn có thể làm:

yourList <- list(c("","668","12345_s_at","667", "4.899777748","49.53333333", 
     "10.10930207", "1.598228663","5.087437057"), 
    c("","376", "6789_at", "375", "4.899655078","136.3333333", 
     "27.82508792", "2.20223398", "5.087437057"), 
    c("", "19265", "12351_s_at", "19264", "4.897730912", 
     "889.3666667", "181.5874908","1.846451572","5.087437057")) 

sapply(yourList, '[[', 3) 
[1] "12345_s_at" "6789_at" "12351_s_at" 

Tiếp theo thời gian bạn có thể cung cấp một số dữ liệu bằng cách sử dụng dput trên một phần của tập dữ liệu của bạn để chúng tôi có thể tái tạo vấn đề của bạn một cách dễ dàng.

+7

Sử dụng 'sapply' để tránh phần 'không công khai'. Ngoài ra, tôi nghĩ rằng '[' sẽ đủ. +1 – GSee

0

Trong trường hợp bạn muốn sử dụng mã bạn gõ vào câu hỏi của bạn, dưới đây là sửa chữa:

listdata <- list(c("","668","12345_s_at","667", "4.899777748","49.53333333", 
     "10.10930207", "1.598228663","5.087437057"), 
    c("","376", "6789_at", "375", "4.899655078","136.3333333", 
     "27.82508792", "2.20223398", "5.087437057"), 
    c("", "19265", "12351_s_at", "19264", "4.897730912", 
     "889.3666667", "181.5874908","1.846451572","5.087437057")) 

v <- character() #creates empty character vector 
list_len <- length(listdata) 
for(i in 1:list_len) 
    v <- c(v, listdata[[i]][3]) #fills the vector with list elements (not efficient, but works fine) 

print(v) 
[1] "12345_s_at" "6789_at" "12351_s_at" 
6

Với purrr bạn có thể trích xuất các thành phần và đảm bảo kiểu dữ liệu nhất quán:

library(purrr) 

listdata <- list(c("","668","12345_s_at","667", "4.899777748","49.53333333", 
     "10.10930207", "1.598228663","5.087437057"), 
    c("","376", "6789_at", "375", "4.899655078","136.3333333", 
     "27.82508792", "2.20223398", "5.087437057"), 
    c("", "19265", "12351_s_at", "19264", "4.897730912", 
     "889.3666667", "181.5874908","1.846451572","5.087437057")) 

map_chr(listdata, 3) 
## [1] "12345_s_at" "6789_at" "12351_s_at" 

Có là các hàm map_ khác cũng thực thi tính nhất quán của loại và map_df() mà cuối cùng có thể giúp kết thúc sự điên rồ của do.call(rbind, …).

+0

chết đơn giản. đây là câu trả lời hiện đại/gọn gàng cho vấn đề này. – Andrew

Các vấn đề liên quan