R : menambahkan kolom dengan nilai yang hilang ke kerangka data

Saya menggunakan data keuangan dan nama baris kerangka data utama saya adalah tanggal.

   > 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

Saya ingin menambahkan kolom (di sini saya ingin menambahkan FOC$close ke aset) dari kerangka data dengan tipe yang sama tetapi beberapa tanggal hilang:

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

Nilai yang hilang seharusnya adalah NA, sehingga akan terlihat seperti ini:

   > 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

Apakah ada cara yang bagus untuk melakukan itu? Saya berhasil melakukan hal serupa dengan baris dengan melakukan sesuatu seperti

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

tapi saya tidak bisa melakukan ini untuk kolom.


person Lemko    schedule 18.04.2014    source sumber


Jawaban (2)


Anda dapat menggunakan metode penggabungan.

Saya pikir Anda menggunakan objek deret waktu xts. Ini menangani nama baris secara otomatis. Dari help(merge.xts), terdapat argumen kata kunci join yang dapat Anda gunakan untuk mengontrol bagaimana penggabungan terjadi. Standarnya adalah 'luar'. Contoh:

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
Saya rasa bukan itu yang dicari OP. Masalahnya adalah nama baris masih diabaikan. (lihat komentar terakhir di jawaban saya) - person Robert Krzyzanowski; 18.04.2014
comment
Saya baru saja menemukan apa yang saya butuhkan: dat ‹- merge(assets,FOC,by=row.names,all.x=T) berhasil, saya tidak tahu saya bisa menggunakan all.x=T untuk mendapatkan NA. Terima kasih untuk bantuannya. - person Lemko; 18.04.2014
comment
@Robert Krzyzanowski Terima kasih -- Saya memperbarui respons untuk memperjelas bahwa penggabungan untuk xts beroperasi pada nama baris (yang harus berupa tanggal). - person slushy; 18.04.2014

Anda dapat mengisinya terlebih dahulu lalu 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'

Hasil:

            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

Urutkan berdasarkan as.POSIXct(row.names(..)) penting karena cbind tidak dicentang. Tanpa itu, kita akan mendapatkan

            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