2010-01-17 32 views
8

Tôi có một danh sách chứa 98 mục. Nhưng mỗi mục chứa 0, 1, 2, 3, 4 hoặc 5 chuỗi ký tự.Tạo một vectơ số lượng các mục trong mỗi mục danh sách

Tôi biết cách lấy độ dài của danh sách và trên thực tế someone has asked the question before và bị bỏ phiếu vì có lẽ đã hỏi một câu hỏi dễ như vậy.

Nhưng tôi muốn một vectơ dài 98 phần tử với mỗi phần tử là một số nguyên từ 0 đến 5 cho tôi biết số chuỗi ký tự có trong mỗi mục danh sách. Tôi đã mong đợi những điều sau đây để làm việc nhưng nó không.

lapply(name.of.list,length()) 

Từ câu hỏi của tôi, bạn sẽ thấy rằng tôi không thực sự biết danh sách các danh sách và mục. Cảm thấy tự do để thẳng tôi ra.

Trả lời

9

Farrel, tôi không chính xác làm theo 'mục' không phải là loại R. Có lẽ bạn có một chiều dài là list trong đó mỗi phần tử là một vectơ của chuỗi ký tự?

Trong trường hợp đó, hãy xem xét điều này:

R> fl <- list(A=c("un", "deux"), B=c("one"), C=c("eins", "zwei", "drei")) 
R> lapply(fl, function(x) length(x)) 
$A 
[1] 2 

$B 
[1] 1 

$C 
[1] 3 
R> do.call(rbind, lapply(fl, function(x) length(x))) 
    [,1] 
A 2 
B 1 
C 3 
R> 

Vì vậy, bạn vector của chiều dài của danh sách của bạn, nói cho bạn nhiều chuỗi mỗi phần tử danh sách đã có. Không phải là do.call(rbind, someList) vừa qua khi chúng tôi nhận được danh sách từ lapply.

Nếu mặt khác bạn muốn tính chiều dài của tất cả các chuỗi tại từng vị trí danh sách, thay thế đơn giản length(x) với một chức năng mới đếm ký tự:

R> lapply(fl, function(x) { sapply(x, function(y) nchar(y)) }) 
$A 
    un deux 
    2 4 

$B 
one 
    3 

$C 
eins zwei drei 
    4 4 4 

R> 

nếu đó không phải muốn bạn muốn , có lẽ bạn có thể giả lập một số dữ liệu đầu vào ví dụ?

Edit:: Đáp lại ý kiến ​​của bạn, những gì bạn muốn có lẽ là

R> do.call(rbind, lapply(fl, length)) 
    [,1] 
A 2 
B 1 
C 3 
R> 

Lưu ý rằng tôi vượt qua trong length, tên của một hàm, và không length(), các (hiển thị) phần thân của hàm. Bởi vì đó là dễ dàng để trộn lên, tôi chỉ đơn giản là áp dụng gần như luôn luôn bọc một chức năng vô danh xung quanh như trong câu trả lời đầu tiên của tôi.

Và vâng, điều này cũng có thể được thực hiện chỉ với sapply hoặc thậm chí một số **ply chức năng:

R> sapply(fl, length) 
A B C 
2 1 3 
R> laply(fl, length) 
[1] 2 1 3 
R> 
+0

Cách thứ nhất bạn đã làm điều đó là những gì tôi muốn. Để tôi thử đi. – Farrel

+0

Yip, nó hoạt động. Tuyệt diệu. Trong thực tế sapply làm việc tốt hơn bởi vì nó thực hiện một vector đơn giản mà bây giờ tôi có thể đi và cbind vào một dataframe từ trước. Bây giờ bạn có thể giải thích cho tôi như thế nào lapply (name.of.list, length()) và lapply (name.of.list, chức năng (x) chiều dài (x)) là khác nhau. – Farrel

+0

Vui lòng xem phần chỉnh sửa bổ sung tại câu trả lời của tôi - về bản chất 'độ dài' khác với' length() 'và bạn muốn cái cũ. –

0

Đoạn code dưới đây chấp nhận một danh sách và trả về một vector có độ dài:

x = c("vectors", "matrices", "arrays", "factors", "dataframes", "formulas", 
     "shingles", "datesandtimes", "connections", "lists") 
xl = list(x) 
fnx = function(xl){length(unlist(strsplit(x, "")))} 
lv = sapply(x, fnx) 
0

Tất cả điều này có vẻ rất phức tạp - có một chức năng đặc biệt làm những gì bạn yêu cầu:

lengths #note the plural "s" 

Sử dụng Dirks dữ liệu mẫu:

fl <- list(A=c("un", "deux"), B=c("one"), C=c("eins", "zwei", "drei")) 
lengths(fl) 

sẽ trả về một số nguyên vector tên:

A B C 
2 1 3 
Các vấn đề liên quan