Anda dapat menambahkan kolom ke data Anda menggunakan berbagai teknik. Kutipan di bawah ini berasal dari bagian "Detail" teks bantuan yang relevan [[.data.frame
,.
Bingkai data dapat diindeks dalam beberapa mode. Ketika [
dan [[
digunakan dengan indeks vektor tunggal ( x[i]
atau x[[i]]
), mereka mengindeks bingkai data seolah-olah itu adalah sebuah daftar.
my.dataframe["new.col"] <- a.vector
my.dataframe[["new.col"]] <- a.vector
Metode data.frame untuk $
, diperlakukan x
sebagai daftar
my.dataframe$new.col <- a.vector
Ketika [
dan [[
digunakan dengan dua indeks ( x[i, j]
dan x[[i, j]]
) mereka bertindak seperti mengindeks matriks
my.dataframe[ , "new.col"] <- a.vector
Karena metode untuk data.frame
mengasumsikan bahwa jika Anda tidak menentukan apakah Anda bekerja dengan kolom atau baris, ini akan menganggap yang Anda maksud adalah kolom.
Untuk contoh Anda, ini seharusnya berhasil:
# make some fake data
your.df <- data.frame(no = c(1:4, 1:7, 1:5), h_freq = runif(16), h_freqsq = runif(16))
# find where one appears and
from <- which(your.df$no == 1)
to <- c((from-1)[-1], nrow(your.df)) # up to which point the sequence runs
# generate a sequence (len) and based on its length, repeat a consecutive number len times
get.seq <- mapply(from, to, 1:length(from), FUN = function(x, y, z) {
len <- length(seq(from = x[1], to = y[1]))
return(rep(z, times = len))
})
# when we unlist, we get a vector
your.df$group <- unlist(get.seq)
# and append it to your original data.frame. since this is
# designating a group, it makes sense to make it a factor
your.df$group <- as.factor(your.df$group)
no h_freq h_freqsq group
1 1 0.40998238 0.06463876 1
2 2 0.98086928 0.33093795 1
3 3 0.28908651 0.74077119 1
4 4 0.10476768 0.56784786 1
5 1 0.75478995 0.60479945 2
6 2 0.26974011 0.95231761 2
7 3 0.53676266 0.74370154 2
8 4 0.99784066 0.37499294 2
9 5 0.89771767 0.83467805 2
10 6 0.05363139 0.32066178 2
11 7 0.71741529 0.84572717 2
12 1 0.10654430 0.32917711 3
13 2 0.41971959 0.87155514 3
14 3 0.32432646 0.65789294 3
15 4 0.77896780 0.27599187 3
16 5 0.06100008 0.55399326 3
Mudah: Bingkai data Anda adalah A
Kemudian Anda mendapatkan kolom b.
sumber
cumsum(b) -> b
hasilnya akan langsung ditambahkan sebagai kolom ke bingkai data asli, sepertiA$groups <- cumsum(b)
.cumsum(b)
akan memberi Anda vektor dengan panjang 3, atau saya kehilangan sesuatu?your.df
data Anda, Anda dapat melakukannyayour.df$group = cumsum(your.df[, 1]==1)
untuk mendapatkan kolom grup baru Anda.Jika saya memahami pertanyaan dengan benar, Anda ingin mendeteksi saat
h_no
tidak bertambah dan kemudian menaikkanclass
. (Saya akan menjelaskan bagaimana saya memecahkan masalah ini, ada fungsi mandiri di bagian akhir.)Kerja
Kami hanya peduli tentang
h_no
kolom untuk saat ini, jadi kami dapat mengekstraknya dari bingkai data:Kami ingin mendeteksi kapan
h_no
tidak naik, yang dapat kami lakukan dengan menghitung ketika perbedaan antara elemen yang berurutan negatif atau nol. R menyediakandiff
fungsi yang memberi kita vektor perbedaan:Setelah kita mendapatkannya, itu adalah masalah sederhana untuk menemukan yang tidak positif:
Di R,
TRUE
danFALSE
pada dasarnya sama dengan1
dan0
, jadi jika kita mendapatkan jumlah kumulatif darinonpos
, itu akan meningkat 1 di (hampir) tempat yang sesuai. Thecumsum
function (yang pada dasarnya adalah kebalikan daridiff
) dapat melakukan hal ini.Tapi, ada dua masalah: angkanya terlalu kecil; dan, kami kehilangan elemen pertama (harus ada empat di kelas pertama).
Masalah pertama adalah hanya diselesaikan:
1+cumsum(nonpos)
. Dan yang kedua hanya perlu menambahkan a1
ke depan vektor, karena elemen pertama selalu ada di kelas1
:Sekarang, kita dapat melampirkannya kembali ke bingkai data kita dengan
cbind
(dengan menggunakanclass=
sintaks, kita dapat membericlass
judul pada kolom ):Dan
data_w_classes
sekarang berisi hasilnya.Hasil akhir
Kita dapat memampatkan garis menjadi satu dan membungkus semuanya menjadi sebuah fungsi agar lebih mudah digunakan:
Atau, karena masuk akal jika
class
menjadi faktor:Anda menggunakan salah satu fungsi seperti:
(Metode pemecahan masalah ini bagus karena menghindari iterasi eksplisit, yang umumnya direkomendasikan untuk R, dan menghindari menghasilkan banyak vektor dan daftar perantara dll. Dan juga agak rapi bagaimana itu dapat ditulis dalam satu baris :))
sumber
Selain jawaban Roman, hal seperti ini mungkin lebih sederhana. Perhatikan bahwa saya belum mengujinya karena saya tidak memiliki akses ke R sekarang.
Fungsi iterasi atas nilai di
n_ho
dan selalu mengembalikan kategori yang dimiliki nilai saat ini. Jika nilai1
terdeteksi, kami meningkatkan variabel globalindex
dan melanjutkan.sumber
Saya percaya bahwa menggunakan "cbind" adalah cara termudah untuk menambahkan kolom ke bingkai data di R. Di bawah ini contohnya:
sumber
sumber
Pendekatan berdasarkan identifikasi jumlah kelompok (
x
dalammapply
) dan panjangnya (y
dalammapply
)sumber