2015-02-21 13 views
10

Amaç Sütun İsimlerin Değiştirilmesi: Küresel ortamda olanlar bütün aşağıdaki listeden Küresel Çevre Veri Çerçeveleri Ar Veri Karelerinin List

colnames sütun Adları değiştirme

Yani.

0) Kolon isimler:

colnames = c("USAF","WBAN","YR--MODAHRMN") 

1) Aşağıdaki data.frames vardır: df1, df2.

dfList <- list(df1,df2) 

3) Döngü listeyi:

2) liste halinde koydu

for (df in dfList){ 
    colnames(df)=colnames 
} 

Ama buna ihtiyacım sütun adları ile df yeni oluşturur, o değil Orijinal sütun adlarını df1, df2 olarak değiştirmeyin. Niye ya? Bir çözüm olabilir mi? Teşekkür

Can gibi bir şey:

lapply(dfList, function(x) {colnames(dfList)=colnames}) 

işin?

cevap

15

Yavaşça aşağıdaki gibi yapabilirsiniz. setNames ikinci argüman olarak yeni sütun adlarının vektörü setNames kullanarak lapply liste üzerinde, Sonra

df1 <- data.frame(A = 1, B = 2, C = 3) 
df2 <- data.frame(X = 1, Y = 2, Z = 3) 
dfList <- list(df1,df2) 
colnames <- c("USAF","WBAN","YR--MODAHRMN") 

ve tedarik:

örnek verileri oluşturma

lapply(dfList, setNames, colnames) 
#[[1]] 
# USAF WBAN YR--MODAHRMN 
#1 1 2   3 
# 
#[[2]] 
# USAF WBAN YR--MODAHRMN 
#1 1 2   3 

Düzenleme

Verileri atamak istiyorsanız.Örneğin, kodunuzu, ilk insan verdi örneği kullanarak Yani, hala colnames olsun ...

dfList <- list(df1 = df1, df2 = df2) 
list2env(lapply(dfList, setNames, colnames), .GlobalEnv) 
+0

Ama sonra .... colnames (df2) size orijinali verir: [1] "X" "Y" "Z" – Oniropolo

+0

@Oniropolo, benim düzenlemeye bakın. Bu, global ortamdaki orijinal data.frames'ınızı değiştirecektir. –

+0

Bu, R bilgim için gelişmiş bir yoldur, ancak ortamlarda okuyordum. 1) neden bir liste yerine yeni bir ortam yaratmadığınızı sorabilir miyim? 2) Daha sonra, strptime (df1 $ YR - MODAHRMN, format = '% Y% m% d% H% M') gibi bazı veri temizlemelerini yapmanız gerektiğini varsayın. Bir ortam yaratmak ve bu yeni çevredeki tüm unsurları değiştirmek mümkün olabilir mi? Bilgi eksikliği için üzgünüm! – Oniropolo

0

for döngüsünün çalışmasını istiyorsanız, tüm data.frame öğesini argüman olarak geçmemelisiniz.

for (df in 1:length(dfList)) 
    colnames(dfList[[df]]) <- colnames 
+0

Gerçekten alamadım: çerçeveleri geri küresel ortama, böyle bir kod değiştirebilir (df2) ... [1] "X" "Y" "Z" – Oniropolo

+0

Df2, df1 ve df2'nin birleşimi olan dfList ile hiçbir ilgisi olmayan bir "data.frame" dir. Bu yüzden, isimler dfList içinde bulunan df2'de değiştirilir. Değiştirilen sütun adları için "colnames (dfList $ df2)" konusuna bakın. – StrikeR

4

Hemen değiştirmek için önerdiğimiz-döngü böyle For döngüsü bir dizin içine:

Veri

df1 <- data.frame(a=runif(5), b=runif(5), c=runif(5)) 
df2 <- data.frame(a=runif(5), b=runif(5), c=runif(5)) 

dflist <- list(df1,df2) 

colnames = c("USAF","WBAN","YR--MODAHRMN") 

Çözüm

for (i in seq_along(dflist)){ 
    colnames(dflist[[i]]) <- colnames 
} 

Çıktı

> dflist 
[[1]] 
     USAF  WBAN YR--MODAHRMN 
1 0.8794153 0.7025747 0.2136040 
2 0.8805788 0.8253530 0.5467952 
3 0.1719539 0.5303908 0.5965716 
4 0.9682567 0.5137464 0.4038919 
5 0.3172674 0.1403439 0.1539121 

[[2]] 
     USAF  WBAN YR--MODAHRMN 
1 0.20558383 0.62651334 0.4365940 
2 0.43330717 0.85807280 0.2509677 
3 0.32614750 0.70782919 0.6319263 
4 0.02957656 0.46523151 0.2087086 
5 0.58757198 0.09633181 0.6941896 

for (df in dfList)'u kullanarak, her seferinde yeni bir df oluşturmakta ve sütun adlarını dokunulmamış orijinal listesine (dfList) bırakacak şekilde değiştirirsiniz.

+0

Neden o zaman ...> colnames (df2) orijinali [1] "a" "b" "c" döndürüyor? – Oniropolo

+0

Değişen data.frames'ler, listenin dışındakiler listeden olanlar değil. Eğer colnames (df2) yaparsanız, orijinal isimleri alacaksınız çünkü df2'ye hiçbir şey olmamıştır. Bunun sonucunu görmek için colnames (dflist [[2]]) 'dır. df2' listedeki ikinci elementtir ve bu değişti. Daha sonra isterseniz df2 <- dflist [[2]] 'yapabilirsiniz. – LyzandeR

+0

Soru o zaman orijinal df2 nasıl değiştirilir? Önemli olan sütunlar orijinal df1, df2; Liste, sadece bir döngüde değişmenin bir yoludur. – Oniropolo