2016-03-30 12 views
0

Ben data.frames listesine sahibim.* Fonksiyonların ailesini uygulayan değişikliklerin nasıl kaydedileceği

> LoDFs <- list(data.frame(y1=c(1,2,3), y2=c(4,5,6)), data.frame(yA=c(1,2,3), yB=c(4,5,6))) 

> LoDFs 
[[1]] 
    y1 y2 
1 1 4 
2 2 5 
3 3 6 

[[2]] 
    yA yB 
1 1 4 
2 2 5 
3 3 6 

Here ayrı ayrı her data.frame işlemek için lapply fonksiyonunu nasıl kullanılacağını buldum. Amacım, özellikle data.frame'deki sütun adlarını değiştirmektir (her iki data.frames, A ve ikinci B adında ilk sütuna sahip olmalıdır). Aşağıdaki denedim:

> col.names <- c("A", "B") 
> lapply(seq_along(LoDFs), function(x) {colnames(LoDFs[[x]]) <- col.names}) 
[[1]] 
[1] "A" "B" 

[[2]] 
[1] "A" "B" 

Ama sadece modifikasyon döner ve özellikle data.frame etkilemedi:

> LoDFs 
[[1]] 
    y1 y2 
1 1 4 
2 2 5 
3 3 6 

[[2]] 
    yA yB 
1 1 4 
2 2 5 
3 3 6 

Nasıl fonksiyonların aile yaptım uygulamak * değişiklikleri kaydetmek için veri?

+1

[bu] ile aynı sorun (http://stackoverflow.com/questions/36307870/r-function-which-has-a-data-frame-parameter-doesnt-work) aşağı dört sorular? – rawr

+0

@rawr Lütfen bahsettiğim örneği sorunumda değiştirebilir ve cevap olarak gönderebilir misiniz? Bağlantılı soruya/cevaba dayanarak fonksiyondan geri dönüşü denedim: "lapply (seq_along (LoDFs)), function (x) {colnames (LoDFs [[x]]) <- col.names; LoDFs}) beklendiği gibi çalışmadı. –

+1

Doğru fikre sahipsiniz, ancak gecikme, LoDF'lerin bireysel öğeleri üzerinde hareket ettiğinden, her bir yineleme için bu yapıyı geri göndermeniz gerekir. Eğer sadece varsa; LoDFs}) ', her iteration_ için yedek listenin tamamı olacaktır. böylece sadece değiştirilmiş öğeleri döndürmeniz gerekir; LoDFs [[x]]}) ' – rawr

cevap

1

Diğer bir seçenek biz yerde değiştirmek gerekiyorsa setNames

lapply(LoDFs, setNames, c('A', 'B')) 
# [[1]] 
# A B 
#1 1 4 
#2 2 5 
#3 3 6 

#[[2]] 
# A B 
#1 1 4 
#2 2 5 
#3 3 6 

, biz magrittr den %<>% operatörünü kullanabilirsiniz olduğunu.

library(magrittr) 
LoDFs %<>% 
     lapply(., setNames, c("A", "B")) 
sapply(LoDFs, names) 
# [,1] [,2] 
#[1,] "A" "A" 
#[2,] "B" "B" 
+0

Bu temel olarak doğrudur, ancak sonucu eski değişkene atamak gereklidir, örn. 'LoDF'ler <- lapply (LoDF'ler, setNames, c (' A ',' B ')) '. Verilerin mümkün olduğu yerde değiştirilip değiştirilmediğini merak ediyorum. –

+0

@WakanTanka Yayını güncellendi. Umarım – akrun

+0

'magrittr' çözümünün bir öncekine benzediğini görür. Bu ilk kez magrittr kodunu görüyorum, yani yanılıyor olabilirim ama burada "sihir" terimi, temel olarak sonucu soldaki işleve atayan "%%" yerine "% <>%' yi kullanmaktadır. yanlış? –

1
lapply(LoDFs, 'names<-', c("A", "B")) 
[[1]] 
    A B 
1 1 4 
2 2 5 
3 3 6 

[[2]] 
    A B 
1 1 4 
2 2 5 
3 3 6 
+0

Bu temel olarak doğrudur, ancak sonucu eski değişkene atamak gereklidir, örn. LoDF'ler <- lapply (LoDF'ler, 'isimler <-', c ("A", "B")). Verilerin mümkün olduğu yerde değiştirilip değiştirilmediğini merak ediyorum. –

+1

@WakanTanka önerdiğin kodu denersen, işe yaradığını bulmalısın. R içinde herhangi bir atama yerinde olabilir – Chris

+0

@ Chris evet çalışır, ancak doğrudan orijinal değişkeni üzerine yazmadan '' apply' işlevinden mümkün olup olmadığını merak ediyordum. –