R : เพิ่มคอลัมน์ที่มีค่าหายไปใน dataframe

ฉันกำลังใช้ข้อมูลทางการเงินและชื่อแถวของ dataframe หลักของฉันคือวันที่

   > assets[1:3,1:5]
            ALD   SFN  TCO KIM   CTX
2003-01-03 48.1 23.98 23.5  23 22.34
2003-01-06 48.1 23.98 23.5  23 22.34
2003-01-07 48.1 23.98 23.5  23 22.34

ฉันต้องการเพิ่มคอลัมน์ (ที่นี่ฉันต้องการเพิ่ม FOC$close ไปยังเนื้อหา) จากดาต้าเฟรมที่เป็นประเภทเดียวกันแต่บางวันหายไป:

   > FOC[1:3,1:2]
           Close Adj.Close
2003-01-03   510       510
2003-01-07   518       518

ค่าที่หายไปควรเป็นของ NA เท่านั้น ดังนั้นจึงมีลักษณะดังนี้:

   > assets[1:3,1:6]
            ALD   SFN  TCO KIM   CTX FOC
2003-01-03 48.1 23.98 23.5  23 22.34 510
2003-01-06 48.1 23.98 23.5  23 22.34 NA
2003-01-07 48.1 23.98 23.5  23 22.34 518

มีวิธีที่ดีในการทำเช่นนั้นหรือไม่? ฉันจัดการทำสิ่งที่คล้ายกันกับแถวโดยทำสิ่งที่ชอบ

> rowtoadd <- list(ALD=18.1,...)
> dataframe[nrow(dataframe) + 1, names(rowtoadd)] <- rowtoadd

แต่ฉันไม่สามารถทำเช่นนี้กับคอลัมน์ได้


person Lemko    schedule 18.04.2014    source แหล่งที่มา


คำตอบ (2)


คุณสามารถใช้วิธีผสานได้

ฉันคิดว่าคุณกำลังใช้วัตถุอนุกรมเวลา xts สิ่งเหล่านี้จะจัดการชื่อแถวโดยอัตโนมัติ จาก help(merge.xts) มีอาร์กิวเมนต์คำหลัก เข้าร่วม ที่คุณสามารถใช้เพื่อควบคุมวิธีการรวมที่เกิดขึ้น โดยค่าเริ่มต้นจะเป็น 'ภายนอก' ตัวอย่าง:

dat = merge(assets[1:3,], FOC[,1:2], join='left')
> dat
            ALD   SFN  TCO KIM   CTX Close Adj.Close
2003-01-03 48.1 23.98 23.5  23 22.34   510       510
2003-01-06 48.1 23.98 23.5  23 22.34    NA        NA
2003-01-07 48.1 23.98 23.5  23 22.34   518       518
person slushy    schedule 18.04.2014
comment
ฉันไม่คิดว่านั่นคือสิ่งที่ OP กำลังมองหา ปัญหาคือชื่อแถวยังคงถูกละเว้น (ดูความคิดเห็นสุดท้ายในคำตอบของฉัน) - person Robert Krzyzanowski; 18.04.2014
comment
ฉันเพิ่งพบสิ่งที่ฉันต้องการ : dat ‹- merge(assets,FOC,by=row.names,all.x=T) ทำเคล็ดลับ ฉันไม่รู้ว่าฉันสามารถใช้ all.x=T เพื่อรับ NA ได้ ขอบคุณสำหรับความช่วยเหลือ - person Lemko; 18.04.2014
comment
@Robert Krzyzanowski ขอบคุณ - ฉันอัปเดตการตอบสนองเพื่อให้ชัดเจนว่าการผสานสำหรับ xts ดำเนินการกับชื่อแถว (ซึ่งต้องเป็นวันที่) - person slushy; 18.04.2014

คุณสามารถกรอกมันก่อนแล้วจึง cbind:

# Example data
df <- data.frame(list(split(rep(c(48.1, 23.98, 23.5, 23, 22.34), each = 3), rep(1:5, each = 3))))
colnames(df) <- c('ALD', 'SFN', 'TCO', 'KIM', 'CTX')
row.names(df) <- paste0('2003-01-0', c(3, 6, 7))
df <- df[order(as.POSIXct(row.names(df))), ] # This is important for cbind to work right
FOC <- data.frame(Close = c(510, 518), Adj.Close = c(510, 518))
row.names(FOC) <- paste0('2003-01-0', c(3, 7))

# Fill in NAs
FOC[setdiff(row.names(df), row.names(FOC)), ] <- NA
df <- cbind(df, FOC[order(as.POSIXct(row.names(FOC))), 1])
colnames(df)[length(df)] <- 'FOC'

ผลลัพธ์:

            ALD   SFN  TCO KIM   CTX FOC
2003-01-03 48.1 23.98 23.5  23 22.34 510
2003-01-06 48.1 23.98 23.5  23 22.34 NA
2003-01-07 48.1 23.98 23.5  23 22.34 518

จัดเรียงตาม as.POSIXct(row.names(..)) มีความสำคัญเนื่องจาก cbind ไม่ได้ตรวจสอบ หากไม่มีมันเราก็จะได้

            ALD   SFN  TCO KIM   CTX FOC
2003-01-03 48.1 23.98 23.5  23 22.34 510
2003-01-06 48.1 23.98 23.5  23 22.34 518
2003-01-07 48.1 23.98 23.5  23 22.34 NA
person Robert Krzyzanowski    schedule 18.04.2014