2012-11-15 15 views
19

Mam listę plików. Mam również listę "nazw", które I substr() od rzeczywistych nazw plików tych plików. Chciałbym dodać nową kolumnę do każdego z plików na liście. Ta kolumna będzie zawierać odpowiedni element w "nazwach" powtarzających się razy liczbę wierszy w pliku.Dodawanie nowej kolumny do każdego elementu na liście tabel lub ramek danych

Na przykład:

df1 <- data.frame(x = 1:3, y=letters[1:3]) 
df2 <- data.frame(x = 4:6, y=letters[4:6]) 
filelist <- list(df1,df2) 
ID <- c("1A","IB") 

pseudokod

for(i in length(filelist)){ 

     filelist[i]$SampleID <- rep(ID[i],nrow(filelist[i]) 

    } 

// zasadzie utworzyć nową kolumnę każdej z dataframes w listy plików, a wypełnienie kolumny repeted odpowiednie wartości ID

moje dane wyjściowe powinny wyglądać następująco:

filelist[1] powinny być:

x y SAmpleID 
1 1 a  1A 
2 2 b  1A 
3 3 c  1A 

fileList[2]

x y SampleID 
1 4 d  IB 
2 5 e  IB 
3 6 f  IB 

i tak dalej .....

Każdy pomysł, jak można to zrobić.

Odpowiedz

24

Alternatywnym rozwiązaniem jest użycie cbind i wykorzystując fakt, że R będzie recylce wartości krótszy wektor.

Na przykład

x <- df2 # from above 
cbind(x, NewColumn="Singleton") 
# x y NewColumn 
# 1 4 d Singleton 
# 2 5 e Singleton 
# 3 6 f Singleton 

Nie ma potrzeby stosowania rep. R robi to za ciebie.

Therfore, można umieścić cbind(filelist[[i]], ID[[i]]) w for loop lub @Sven wskazał, można użyć odkurzacza mapply:

filelist <- mapply(cbind, filelist, "SampleID"=ID, SIMPLIFY=F) 
+4

Dziękuję wszystkim bardzo za pomoc i wyjątkowe podejście. Pętla for, mapply() i cbind działają jak uroki. Nauczyłem się takiego języka i uczę się czegoś nowego za każdym razem, gdy stawiam pytanie na tej tablicy. Przykro mi, że nie mogłem napisać wcześniej, aby wyrazić moją wdzięczność i uznanie. Dzięki – user1079898

16

Jest to poprawiona wersja swojej pętli:

for(i in seq_along(filelist)){ 

    filelist[[i]]$SampleID <- rep(ID[i],nrow(filelist[[i]])) 

} 

Były 3 problemy:

  • Ostateczna ) zaginął po komendzie w organizmie.
  • Elementy list są dostępne przez [[, a nie przez [. [ zwraca listę długości pierwszej. [[ zwraca tylko element.
  • length(filelist) to tylko jedna wartość, więc pętla działa tylko dla ostatniego elementu listy. Wymieniłem go na seq_along(filelist).

Bardziej efektywnym podejściem jest użycie mapply dla zadania:

mapply(function(x, y) "[<-"(x, "SampleID", value = y) , 
     filelist, ID, SIMPLIFY = FALSE) 
+12

You dont naprawdę trzeba anonimowy funkcja w 'mapply'. '' mapply ('[<-', filelist, 'sampleID', value = ID, SIMPLIFY = FALSE) '' zadziała – mnel

+0

@mnel +1 Świetny pomysł, dziękuję. –

+0

Przyjąłem również twoją odpowiedź. Myślałem, że możesz przyjąć dwie odpowiedzi, ponieważ wszystkie były bardzo pomocne. Przykro mi, ale nie chciałem cię urazić w żaden sposób. W rzeczywistości pętla for była świetna, a wyjaśnienie najbardziej pomocne. Dziękuję bardzo! – user1079898

1

trudne sposób:

library(plyr) 

names(filelist) <- ID 
result <- ldply(filelist, data.frame) 
Powiązane problemy