2014-12-15 2 views
2

Я немного смущен относительно того, работает ли lapply в списке или на векторе. См два примера нижеlapply работает над массивом или одним элементом?

  1. Здесь средняя функция применяется над массивом чисел, то есть, от 1 до 5

    x = list(a=1:5, b=rnorm(10)) 
    x 
    
    #$a 
    #[1] 1 2 3 4 5 
    # 
    #$b 
    #[1] -0.57544290 0.51035240 0.43143241 -0.97971957 -0.99845378 
    #[6] 0.77389008 -0.08464382 0.68420547 1.64793617 -0.39688809 
    
    lapply(x,mean) 
    #$a 
    #[1] 3 
    # 
    #$b 
    #[1] 0.1012668 
    
  2. Но здесь, функция runif наносится поверх каждого отдельного элемента массив

    x = 1:4 
    
    lapply(x,runif) 
    #[[1]] 
    #[1] 0.5914268 
    
    #[[2]] 
    #[1] 0.6762355 0.3072287 
    
    #[[3]] 
    #[1] 0.8439318 0.8488374 0.1158645 
    
    #[[4]] 
    #[1] 0.8519037 0.8384169 0.2894639 0.4066553 
    

Мой вопрос, что именно делает lapply работать? массив или отдельный элемент? И как это правильно выбрать в зависимости от функции?

+1

'lapply' работает над первым уровнем элементов, составляющих объект. В случае 1), это каждый элемент «list», в 2) это каждое значение в «vector». – thelatemail

+0

@thelatemail, спасибо. Я не понял термин «первый уровень элементов». Не могли бы вы объяснить? – IAMTubby

+1

Чтобы использовать аналогию, если у меня есть 4 шоколадных батончика ('1: 4'), лаппель будет работать на каждом баре. Если у меня есть 2 коробки, содержащие шоколадные батончики ('list (1: 2,3: 4)'), то на каждом ящике будет работать lapply. – thelatemail

ответ

4

lapply будет работать над тем, что является наивысшим уровнем, определяющим структуру объекта R.

Если у меня есть 4 отдельных целых чисел, lapply будет работать на каждое целом:

x <- 1:4 

lapply(x, identity) 
#[[1]] 
#[1] 1 
# 
#[[2]] 
#[1] 2 
# 
#[[3]] 
#[1] 3 
# 
#[[4]] 
#[1] 4 

Однако, если у меня есть list длина == 2 каждые из которых содержит 2 значения, lapply будет работать по каждому объекту списка.

x <- list(1:2,3:4) 
lapply(x, identity) 
#[[1]] 
#[1] 1 2 
# 
#[[2]] 
#[1] 3 4 
+0

(1,5 года спустя копать ... :)) Возможно, будет полезно отметить, что 'lapply' принуждается к' as.list' перед любыми манипуляциями и работает над этой структурой; в случае «целочисленных» когерентностей сначала «перечислить», а в случае «списка» просто использует ту же структуру. –

Смежные вопросы