Mengubah Nama Kolom dalam Daftar Bingkai Data di R

Tujuan: Mengubah Nama Kolom semua Bingkai Data di Lingkungan Global dari daftar berikut

nama samaran yang ada di lingkungan global

So.

0) Nama Kolomnya adalah:

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

1) Saya memiliki data.frame berikut: df1, df2.

2) Saya memasukkannya ke dalam daftar:

  dfList <- list(df1,df2)

3) Ulangi daftar:

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

Tapi ini membuat df baru dengan nama kolom yang saya butuhkan, tidak mengubah nama kolom asli di df1, df2. Mengapa? Bisakah lapply menjadi solusi? Terima kasih

Bisakah sesuatu seperti:

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

bekerja?


person Oniropolo    schedule 21.02.2015    source sumber


Jawaban (4)


Dengan lapply Anda dapat melakukannya sebagai berikut.

Buat data sampel:

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") 

Kemudian, terapkan daftar tersebut menggunakan setNames dan berikan vektor nama kolom baru sebagai argumen kedua ke setNames:

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

Sunting

Jika Anda ingin menetapkan data.frame kembali ke lingkungan global, Anda dapat mengubah kode seperti ini:

dfList <- list(df1 = df1, df2 = df2)
list2env(lapply(dfList, setNames, colnames), .GlobalEnv)
person talat    schedule 21.02.2015
comment
@Oniropolo, lihat hasil edit saya. Ini akan mengubah data.frame asli Anda di lingkungan global - person talat; 21.02.2015
comment
Ini adalah cara untuk meningkatkan pengetahuan R saya, tetapi saya membaca tentang lingkungan. Bolehkah saya bertanya mengapa 1) Anda tidak membuat lingkungan baru, bukan daftar? 2) Misalkan Anda perlu melakukan pembersihan data, seperti strptime(df1$YR--MODAHRMN,format ='%Y%m%d%H%M'). Mungkinkah menciptakan lingkungan dan kemudian memodifikasi semua elemen di lingkungan baru ini? Maaf atas kurangnya pengetahuan! - person Oniropolo; 21.02.2015
comment
@Oniropolo, pertanyaan Anda didasarkan pada memiliki daftar data.frame yang ingin Anda ubah namanya - itulah mengapa saya menggunakan struktur daftar.. Biasanya, jika Anda memiliki banyak data.frame yang terkait, lebih baik menyimpannya dalam daftar (yaitu tidak menetapkannya kembali ke lingkungan global). Secara umum, saya hampir tidak pernah membuat lingkungan tambahan tetapi itu tergantung pada preferensi pemrograman pribadi, saya kira. - person talat; 21.02.2015
comment
Terima kasih banyak! Saya tidak tahu apa itu lingkungan sebelum jawaban Anda! - person Oniropolo; 21.02.2015

Ubah saja for-loop Anda menjadi for-loop indeks seperti ini:

Data

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") 

Larutan

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

Keluaran

> 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

Dengan menggunakan for (df in dfList) Anda pada dasarnya membuat df baru setiap kali dan mengubah nama kolom menjadi nama yang membiarkan daftar asli (dfList) tidak tersentuh.

person LyzandeR    schedule 21.02.2015
comment
Lalu mengapa...› colnames(df2) mengembalikan [1] a b c ? - person Oniropolo; 21.02.2015
comment
Karena data.frame yang berubah adalah yang ada di dalam daftar, bukan yang di luar daftar. Jika Anda melakukan colnames(df2) Anda akan mendapatkan nama asli karena tidak terjadi apa-apa pada df2. Lakukan colnames(dflist[[2]]) untuk melihat hasilnya. df2 adalah elemen kedua dalam daftar dan inilah yang berubah. Anda dapat melakukan df2 <- dflist[[2]] jika Anda mau setelahnya. - person LyzandeR; 21.02.2015
comment
Pertanyaannya kemudian bagaimana cara mengubah df2 yang asli? Kolom yang penting adalah df1 asli, df2; daftar ini hanyalah cara untuk mengubah keduanya dalam satu putaran. - person Oniropolo; 21.02.2015
comment
Saya memberikan solusi di atas :): df2 <- dflist[[2]] - person LyzandeR; 21.02.2015
comment
Ohhh, kalimat paling sederhana yang mungkin. Bagaimana hal itu tidak terpikir olehku. Terima kasih! - person Oniropolo; 21.02.2015
comment
Jangan khawatir. Lihat solusi @docendodidiscimus di atas. Ini sedikit lebih maju, tetapi mungkin layak untuk dipelajari. - person LyzandeR; 21.02.2015
comment
@Oniropolo harap edit baris pertama pertanyaan Anda untuk mencerminkan bahwa bukan data.frames dalam daftar yang ingin Anda ubah nama kolomnya, tetapi nama kolom yang ada di lingkungan global. - person StrikeR; 21.02.2015

Jika Anda ingin loop for berfungsi, Anda tidak boleh meneruskan seluruh data.frame sebagai argumen.

for (df in 1:length(dfList))
  colnames(dfList[[df]]) <- colnames
person StrikeR    schedule 21.02.2015
comment
Saya benar-benar tidak mengerti... Jadi misalnya menggunakan contoh yang diberikan orang pertama, dengan kode Anda, saya masih mendapatkan colnames(df2) ...[1] XYZ - person Oniropolo; 21.02.2015
comment
Dalam jawaban yang Anda bicarakan, df2 adalah data.frame yang tidak ada hubungannya dengan dfList, yang merupakan kombinasi dari df1 dan df2. Jadi, nama-nama tersebut diubah di df2 yang ada di dalam dfList. Lihat colnames(dfList$df2) untuk nama kolom yang diubah. - person StrikeR; 21.02.2015

person    schedule
comment
Meskipun cuplikan kode ini dapat menyelesaikan pertanyaan, menyertakan penjelasan sangat membantu meningkatkan kualitas postingan Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa mendatang, dan orang-orang tersebut mungkin tidak mengetahui alasan saran kode Anda. - person Gerhard; 05.07.2021
comment
Mungkin...ini masih lebih baik dari solusi yang diterima :) - person Dan Lewer; 05.07.2021