2013-02-12 11 views
5

Mam małe pytanie dotyczące funkcji stosowania. Na przykład mam:Jak podzielić listę danych.frame i zastosować funkcję do jednej kolumny?

l <- list(a = data.frame(A1=rep(10,5),B1=c(1,1,1,2,2),C1=c(5,10,20,7,30)), 
      b = data.frame(A1=rep(20,5),B1=c(3,3,4,4,4),C1=c(3,5,10,20,30))) 

Chcę znaleźć minimalną C1 dla każdego B1. Wynik powinien być

$a 
    A1 B1 C1 
    10 1 5 
    10 2 7 

$b 
    A1 B1 C1 
    20 3 3 
    20 4 10 

wiem, jak to zrobić z „za”, ale to musi być łatwiejszy sposób z „lapply”, ale nie mogłem zrobić to działa.

Proszę o pomoc

Odpowiedz

2

Oto kolejny podejście, które pasuje do żądanej mocy:

lapply(l, function(x) { 
    temp <- ave(x[["C1"]], x["B1"], FUN = min) 
    x[x[["C1"]] == temp, ] 
}) 
# $a 
# A1 B1 C1 
# 1 10 1 5 
# 4 10 2 7 
# 
# $b 
# A1 B1 C1 
# 1 20 3 3 
# 3 20 4 10 
+0

to jest dokładnie to, czego chciałem, wielkie dzięki. Nie znałem tego rodzaju wykorzystania – Tali

3

Co łączy lapply i tapply:

lapply(l, function(i) tapply(i$C1, i$B1, min)) 
$a 
1 2 
5 7 

$b 
3 4 
3 10 

Trick do myślenia o wielu operacjach jest podzielić zadanie na bitach. SO

  1. Minimalna C1 dla każdego B1. Jak to zrobić dla pojedynczej ramki danych pojedynczej?

    i = l[[1]] 
    tapply(i$C1, i$B1, min) 
    
  2. Każdy element listy? Wystarczy użyć lapply:

    lapply(l, function(i) tapply(i$C1, i$B1, min)) 
    

Jeśli nie można zrobić krok 1, nie będzie w stanie zarządzać Krok 2.

+0

Bardzo dziękuję – Tali

0

Możesz także spróbować llply + dcast z przybornika plyr/reshape2:

library(reshape2) 
library(plyr) 

    l <- list(a = data.frame(A1=rep(10,5),B1=c(1,1,1,2,2),C1=c(5,10,20,7,30)), 
       b = data.frame(A1=rep(20,5),B1=c(3,3,4,4,4),C1=c(3,5,10,20,30))) 

    llply(l, function (x) {dcast (x, A1+B1~., value.var="C1", min)}) 
3

Niedawno ulegli sygnalizatora piosenki pakietu data.table i jego połączenie wszechstronności i szybkości robienia operacji tak, ja przedstawić kolejną rozwiązanie:

library(data.table) 
lapply(l, function(dat) { 
    data.table(dat, key="B1,C1")[list(unique(B1)), mult="first"] 
}) 

Jeśli zachowując oryginalną kolejność kolumn jest ważne, z jakiegoś powodu wywołanie data.table() może zostać opakowane przez setcolorder(..., names(dat)).

Powiązane problemy