2017-12-25 110 views
6

Tôi có một hàm trả về danh sách danh sách. Tôi muốn tách kết quả của danh sách. Các yếu tố đầu tiên từ các yếu tố thứ hai. Dưới đây là một ví dụ:Cách tách đầu ra của danh sách trong R

x1 <- replicate(4,0.5) 
x2 <- replicate(4,0.7) 
x <- list(x1,x2) 
y <- list(0.5,0.6,0.3,0.4) 
myfu <- function(x,y){ 
    out <- list() 
out$y <- lapply(1:4, function(i){lapply(1:2, function(j) y[[i]]*x[[j]])}) 
return(out) 
} 

Hàm này trả về này:

$y 
$y[[1]] 
$y[[1]][[1]] 
[1] 0.25 0.25 0.25 0.25 

$y[[1]][[2]] 
[1] 0.35 0.35 0.35 0.35 


$y[[2]] 
$y[[2]][[1]] 
[1] 0.3 0.3 0.3 0.3 

$y[[2]][[2]] 
[1] 0.42 0.42 0.42 0.42 


$y[[3]] 
$y[[3]][[1]] 
[1] 0.15 0.15 0.15 0.15 

$y[[3]][[2]] 
[1] 0.21 0.21 0.21 0.21 


$y[[4]] 
$y[[4]][[1]] 
[1] 0.2 0.2 0.2 0.2 

$y[[4]][[2]] 
[1] 0.28 0.28 0.28 0.28 

Câu hỏi của tôi là, Làm thế nào tôi có thể tách tất cả y[[i]][[1]] từ khắp nơi y[[i]][[2]]. Tức là, tôi muốn có kết quả như sau:

$y 
$y[[1]] 
$y[[1]][[1]] 
[1] 0.25 0.25 0.25 0.25 

$y[[2]] 
$y[[2]][[1]] 
[1] 0.3 0.3 0.3 0.3 

$y[[3]] 
$y[[3]][[1]] 
[1] 0.15 0.15 0.15 0.15 


$y[[4]] 
$y[[4]][[1]] 
[1] 0.2 0.2 0.2 0.2 

và tương tự cho yếu tố thứ hai.

Trả lời

2

Vấn đề của bạn có thể theo cách của bạn thực hiện lapply chức năng. Cách dễ nhất để có được những gì bạn muốn chỉ là thay đổi một chút chức năng lapply của bạn. Đó là,

x1 <- replicate(4,0.5) 
x2 <- replicate(4,0.7) 
x <- list(x1,x2) 
y <- list(0.5,0.6,0.3,0.4) 
myfu <- function(x,y){ 
    out <- list() 
    out$y <- lapply(1:2, function(i){lapply(1:4, function(j) y[[j]]*x[[i]])}) 

    return(out) 
} 

Do đó, sản lượng là:

> myfu(x,y) 
$y 
$y[[1]] 
$y[[1]][[1]] 
[1] 0.25 0.25 0.25 0.25 

$y[[1]][[2]] 
[1] 0.3 0.3 0.3 0.3 

$y[[1]][[3]] 
[1] 0.15 0.15 0.15 0.15 

$y[[1]][[4]] 
[1] 0.2 0.2 0.2 0.2 


$y[[2]] 
$y[[2]][[1]] 
[1] 0.35 0.35 0.35 0.35 

$y[[2]][[2]] 
[1] 0.42 0.42 0.42 0.42 

$y[[2]][[3]] 
[1] 0.21 0.21 0.21 0.21 

$y[[2]][[4]] 
[1] 0.28 0.28 0.28 0.28 
7

Chúng ta có thể sử dụng transpose

library(purrr) 
myfu(x, y) %>% 
     map(transpose) 
+0

Cảm ơn bạn rất nhiều vì đã giúp đỡ của bạn. Nó thực sự tuyệt vời. Chúng ta có thể sử dụng nó bên trong chức năng? – Alice

+3

@Alice Vâng, bạn có thể làm 'out%>% map (transpose)' và sau đó gọi 'myfu (x, y)' – akrun

+2

Tôi nghĩ rằng vấn đề là cách thực hiện chức năng 'lapply'. –

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