การเปลี่ยนชื่อคอลัมน์ในรายการเฟรมข้อมูลใน R

วัตถุประสงค์: เปลี่ยนชื่อคอลัมน์ของกรอบข้อมูลทั้งหมด ในสภาพแวดล้อมส่วนกลาง จากรายการต่อไปนี้

ชื่อย่อของชื่อในสภาพแวดล้อมโลก

So.

0) ชื่อคอลัมน์คือ:

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

1) ฉันมี data.frames ต่อไปนี้: df1, df2

2) ฉันใส่ไว้ในรายการ:

  dfList <- list(df1,df2)

3) วนซ้ำรายการ:

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

แต่สิ่งนี้จะสร้าง df ใหม่พร้อมชื่อคอลัมน์ที่ฉันต้องการ โดยจะไม่เปลี่ยนชื่อคอลัมน์ดั้งเดิมใน df1, df2 ทำไม สามารถใช้เป็นวิธีแก้ปัญหาได้หรือไม่? ขอบคุณ

สิ่งที่ชอบ:

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

งาน?


person Oniropolo    schedule 21.02.2015    source แหล่งที่มา


คำตอบ (4)


ด้วย lapply คุณสามารถทำได้ดังนี้

สร้างข้อมูลตัวอย่าง:

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

จากนั้น ปัดทับรายการโดยใช้ setNames และระบุเวกเตอร์ของชื่อคอลัมน์ใหม่เป็นอาร์กิวเมนต์ที่สองให้กับ setNames:

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

แก้ไข

หากคุณต้องการกำหนด data.frames กลับไปยังสภาพแวดล้อมส่วนกลาง คุณสามารถแก้ไขโค้ดได้ดังนี้:

dfList <- list(df1 = df1, df2 = df2)
list2env(lapply(dfList, setNames, colnames), .GlobalEnv)
person talat    schedule 21.02.2015
comment
@Oniropolo ดูการแก้ไขของฉัน สิ่งนี้จะเปลี่ยน data.frames ดั้งเดิมของคุณในสภาพแวดล้อมส่วนกลาง - person talat; 21.02.2015
comment
นี่เป็นวิธีขั้นสูงสำหรับความรู้ R ของฉัน แต่ฉันอ่านเกี่ยวกับสภาพแวดล้อม ฉันถามคุณได้ไหมว่าทำไม 1) คุณไม่สร้างสภาพแวดล้อมใหม่แทนที่จะเป็นรายการ 2) สมมติว่าคุณต้องทำการล้างข้อมูล เช่น strptime(df1$YR--MODAHRMN,format ='%Y%m%d%H%M') เป็นไปได้ไหมที่จะสร้างสภาพแวดล้อมแล้วแก้ไของค์ประกอบทั้งหมดในสภาพแวดล้อมใหม่นี้ ขออภัยที่ไม่มีความรู้! - person Oniropolo; 21.02.2015
comment
@Oniropolo คำถามของคุณขึ้นอยู่กับการมีรายการ data.frames ที่คุณต้องการเปลี่ยนชื่อ - นั่นคือเหตุผลที่ฉันใช้โครงสร้างรายการ .. โดยปกติหากคุณมี data.frames จำนวนมากที่เกี่ยวข้องกัน ควรเก็บไว้จะดีกว่า ในรายการ (เช่น ไม่กำหนดกลับไปยังสภาพแวดล้อมโกลบอล) โดยทั่วไปแล้ว ฉันแทบจะไม่เคยสร้างสภาพแวดล้อมเพิ่มเติมเลย แต่นั่นขึ้นอยู่กับการตั้งค่าโปรแกรมส่วนตัว ฉันคิดว่า - person talat; 21.02.2015
comment
ขอบคุณมาก! ฉันไม่รู้ว่าสภาพแวดล้อมคืออะไรก่อนที่คุณจะตอบ! - person Oniropolo; 21.02.2015

เพียงเปลี่ยน for-loop ของคุณให้เป็นดัชนี for-loop ดังนี้:

ข้อมูล

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

สารละลาย

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

เอาท์พุต

> 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) หมายความว่าคุณกำลังสร้าง df ใหม่ทุกครั้งและเปลี่ยนชื่อคอลัมน์เป็นชื่อคอลัมน์โดยไม่ให้รายการเดิม (dfList) ไม่ถูกแตะต้อง

person LyzandeR    schedule 21.02.2015
comment
ทำไม...› colnames(df2) ส่งคืนค่าเดิม [1] a b c ? - person Oniropolo; 21.02.2015
comment
เนื่องจาก data.frames ที่เปลี่ยนแปลงคืออันที่อยู่ในรายการ ไม่ใช่อันที่อยู่นอกรายการ หากคุณทำ colnames(df2) คุณจะได้ชื่อเดิมเพราะไม่มีอะไรเกิดขึ้นกับ df2 ทำ colnames(dflist[[2]]) แทนเพื่อดูผลลัพธ์ df2 คือองค์ประกอบที่สองในรายการ และนี่คือสิ่งที่เปลี่ยนแปลง คุณสามารถทำ df2 <- dflist[[2]] ได้ถ้าคุณต้องการในภายหลัง - person LyzandeR; 21.02.2015
comment
คำถามคือจะเปลี่ยน df2 ดั้งเดิมได้อย่างไร? คอลัมน์ที่สำคัญคือ df1, df2 ดั้งเดิม; รายการเป็นเพียงวิธีหนึ่งในการเปลี่ยนแปลงทั้งสองอย่างในวงเดียว - person Oniropolo; 21.02.2015
comment
ฉันให้วิธีแก้ปัญหาข้างต้นแล้ว :): df2 <- dflist[[2]] - person LyzandeR; 21.02.2015
comment
โอ้ บรรทัดที่ง่ายที่สุดที่เป็นไปได้ มันไม่เกิดขึ้นกับฉันได้อย่างไร ขอบคุณ! - person Oniropolo; 21.02.2015
comment
ไม่ต้องห่วง. ดูโซลูชัน @docendodiscimus ด้านบน มันก้าวหน้ากว่าเล็กน้อย แต่มันอาจจะคุ้มค่าที่จะเรียนรู้ - person LyzandeR; 21.02.2015
comment
@Oniropolo โปรดแก้ไขบรรทัดแรกของคำถามของคุณเพื่อสะท้อนให้เห็นว่าไม่ใช่ data.frames ในรายการที่คุณต้องการเปลี่ยนชื่อ colnames แต่เป็น colnames ของรายการในสภาพแวดล้อมระดับโลก - person StrikeR; 21.02.2015

หากคุณต้องการให้ for วนซ้ำทำงาน คุณไม่ควรส่ง data.frame ทั้งหมดเป็นอาร์กิวเมนต์

for (df in 1:length(dfList))
  colnames(dfList[[df]]) <- colnames
person StrikeR    schedule 21.02.2015
comment
ฉันไม่เข้าใจจริงๆ... ดังนั้นตัวอย่างจากตัวอย่างที่คนแรกให้มา รหัสของคุณ ฉันยังคงได้รับ colnames(df2) ...[1] เอ็กซ์ วาย ซี - person Oniropolo; 21.02.2015
comment
ในคำตอบที่คุณกำลังพูดถึง df2 คือ data.frame ซึ่งไม่มีส่วนเกี่ยวข้องกับ dfList ซึ่งเป็นการรวมกันของ df1 และ df2 ดังนั้นชื่อจึงเปลี่ยนไปใน df2 ที่มีอยู่ใน dfList ดูที่ colnames(dfList$df2) สำหรับชื่อคอลัมน์ที่เปลี่ยนแปลง - person StrikeR; 21.02.2015

person    schedule
comment
แม้ว่าข้อมูลโค้ดนี้อาจช่วยแก้ปัญหาได้ แต่ การรวมคำอธิบาย จะช่วยปรับปรุงได้จริงๆ คุณภาพของโพสต์ของคุณ โปรดจำไว้ว่าคุณกำลังตอบคำถามให้กับผู้อ่านในอนาคต และคนเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำโค้ดของคุณ - person Gerhard; 05.07.2021
comment
บางที ... มันยังดีกว่าวิธีแก้ปัญหาที่ยอมรับ :) - person Dan Lewer; 05.07.2021