2012-11-28 24 views
5

Khi tạo danh sách lồng nhau R có, những gì tôi xem xét, cấu trúc đặt tên hữu ích cho các yếu tố của danh sách. Tôi có một danh sách các danh sách và muốn áp dụng một hàm của mỗi vectơ đơn chứa trong bất kỳ danh sách nào. lapply thực hiện điều này nhưng sau đó loại bỏ cấu trúc đặt tên của danh sách. Làm thế nào tôi có thể lapply của mọi phần tử vectơ của danh sách lồng nhau mà không tước tên? Tôi đã cố gắng vượt qua chỉ số thay vào đó nhưng điều đó dường như làm điều tương tự (tên dải).lapply trên danh sách lồng nhau và giữ lại đặt tên/cấu trúc

TEST <- list(n1=list(a="5", b="65"), n2=list(a="f", b= "f6")) 
TEST 
lapply(TEST, function(x) gsub("6", "foo", x)) 
lapply(seq_along(TEST), function(i) gsub("6", "foo", TEST[[i]])) 

điều khiển Output:

> TEST 
$n1 
$n1$a 
[1] "5" 

$n1$b 
[1] "65" 


$n2 
$n2$a 
[1] "f" 

$n2$b 
[1] "f6" 


> lapply(TEST, function(x) gsub("6", "foo", x)) 
$n1 
[1] "5" "foo5" 

$n2 
[1] "f" "ffoo" 

kết quả mong muốn:

$n1 
$n1$a 
[1] "5" 

$n1$b 
[1] "foo5" 


$n2 
$n2$a 
[1] "f" 

$n2$b 
[1] "ffoo" 
+0

@shujaa vâng tôi chỉnh sửa để phản ánh nhận xét của bạn –

Trả lời

10

Có vẻ như bạn muốn rapply biến thể của * Áp dụng gia đình

rapply(TEST, function(x){gsub("6", "foo", x)}, how = "list") 

$n1 
$n1$a 
[1] "5" 

$n1$b 
[1] "foo5" 


$n2 
$n2$a 
[1] "f" 

$n2$b 
[1] "ffoo" 

Bạn cũng có thể làm nó như thế này để tránh phải viết một chức năng ẩn danh

rapply(TEST, gsub, pattern = "6", replacement = "foo", how = "list") 
+0

1 đánh bại tôi vào nó, và đã cứu tôi một số cách gõ – Andrie

+1

Ohh mới R voodoo kỳ diệu Tôi chưa bao giờ chơi với. Cảm ơn Dason. Tôi biết về 'rapply' nhưng không biết cách sử dụng nó. Hoàn hảo. –

+0

Bất kỳ cách nào khác mà không có 'rapply'? nó đánh giá các đối số của nó để nó không hữu ích khi lặp qua các đối tượng ngôn ngữ. – jangorecki

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