df <- data.frame(x = 1:5, y = 6:10)
df x y
1 1 6
2 2 7
3 3 8
4 4 9
5 5 10
df$z <- df$x + df$y
df x y z
1 1 6 7
2 2 7 9
3 3 8 11
4 4 9 13
5 5 10 15
Teknik data munging/wrangling adalah proses membersihkan, mengubah, dan menyiapkan data agar siap dianalisis. Pada R, terdapat berbagai fungsi dan pendekatan untuk melakukan manipulasi data.
Menambah kolom baru dari hasil perhitungan, transformasi, atau aturan tertentu.
df <- data.frame(x = 1:5, y = 6:10)
df x y
1 1 6
2 2 7
3 3 8
4 4 9
5 5 10
df$z <- df$x + df$y
df x y z
1 1 6 7
2 2 7 9
3 3 8 11
4 4 9 13
5 5 10 15
Mengambil bagian tertentu dari data dengan cara menggunakan operator logika atau fungsi seleksi.
Operator logika:
== (sama dengan), != (tidak sama), > < >= <=
%in% (cek keanggotaan dalam vektor)
is.na(), is.null(), is.numeric()
df <- data.frame(A=c("A1","A2","A1","A3"), nilai=c(10,20,15,25))
df A nilai
1 A1 10
2 A2 20
3 A1 15
4 A3 25
subset1 <- df[df$A=="A1", ] # pilih baris dengan A = "A1"
subset1 A nilai
1 A1 10
3 A1 15
subset2 <- df[df$nilai > 15, ] # pilih baris dengan nilai > 15
subset2 A nilai
2 A2 20
4 A3 25
subset3 <- df[df$A %in% c("A1","A3"), ]
subset3 A nilai
1 A1 10
3 A1 15
4 A3 25
Mengurutkan data berdasarkan 1 atau lebih kolom.
Fungsi yang sering digunakan:
sort() → mengurutkan vektor
order() → mengurutkan indeks
which() → mencari posisi elemen tertentu
rev() → membalik urutan
unique() → menghapus nilai duplikat
df <- data.frame(x=c(3,1,2), y=c(10,30,20))
df_sorted <- df[order(df$x), ] # urutkan berdasarkan x (ascending)
df_sorted x y
2 1 30
3 2 20
1 3 10
df_sorted_desc <- df[order(df$y, decreasing=T), ] # urutkan y (descending)
df_sorted_desc x y
2 1 30
3 2 20
1 3 10
Recoding sering dipakai untuk membuat variabel dummy atau mengklasifikasikan kategori baru.
df <- data.frame(A=c("A1","A2","A1","A3"), nilai=c(10,20,15,25))
df$baru <- 1*(df$nilai <= 15) + 0*(df$nilai > 15)
df A nilai baru
1 A1 10 1
2 A2 20 0
3 A1 15 1
4 A3 25 0
ifelse()df$baru <- ifelse(df$nilai <= 15, "Rendah", "Tinggi")
df A nilai baru
1 A1 10 Rendah
2 A2 20 Tinggi
3 A1 15 Rendah
4 A3 25 Tinggi
recode() dari package carlibrary(car)Loading required package: carData
df$kategori <- recode(df$nilai, "10:15='A'; 20:25='B'; else='C'")
df A nilai baru kategori
1 A1 10 Rendah A
2 A2 20 Tinggi B
3 A1 15 Rendah A
4 A3 25 Tinggi B
Menggabungkan dua atau lebih data frame.
Metode:
cbind() → menggabungkan kolom
rbind() → menggabungkan baris
merge() → lebih fleksibel, mirip SQL join
df1 <- data.frame(ID=c(1,2,3), x=c(10,20,30))
df2 <- data.frame(ID=c(2,3,4), y=c(200,300,400))
# Inner join
merge(df1, df2, by="ID") ID x y
1 2 20 200
2 3 30 300
# Left join
merge(df1, df2, by="ID", all.x=TRUE) ID x y
1 1 10 NA
2 2 20 200
3 3 30 300
# Full join
merge(df1, df2, by="ID", all=TRUE) ID x y
1 1 10 NA
2 2 20 200
3 3 30 300
4 4 NA 400
Mengubah data dari long → wide atau wide → long dengan fungsi: reshape()
data_long <- data.frame(
ID=c(1,1,2,2),
waktu=c("T1","T2","T1","T2"),
skor=c(80,90,70,75)
)
data_long ID waktu skor
1 1 T1 80
2 1 T2 90
3 2 T1 70
4 2 T2 75
wide <- reshape(data_long, idvar="ID", timevar="waktu", direction="wide")
wide ID skor.T1 skor.T2
1 1 80 90
3 2 70 75
long <- reshape(wide, varying=list(c("skor.T1","skor.T2")),
direction="long", v.names="skor")
long ID time skor id
1.1 1 1 80 1
2.1 2 1 70 2
1.2 1 2 90 1
2.2 2 2 75 2
Buatlah sebuah data frame bernama df dengan 2 kolom: A = c("X1","X2","X3","X4") dan nilai = c(10,15,20,25). Tambahkan kolom baru nilai2 yang berisi nilai dikali 2.
Dari data frame df, ambil baris yang memiliki nilai > 15.
Urutkan data frame df berdasarkan kolom nilai secara menurun.
Gunakan ifelse() untuk membuat kolom baru kategori, dengan aturan:
nilai >= 20 → "Tinggi"
selain itu → "Rendah"
Gunakan fungsi recode() dari package car untuk mengubah variabel nilai menjadi:
10:15 = "A"
20:25 = "B"
Buat data frame kedua df2 dengan isi:
A = c(“X2”,“X4”), keterangan = c(“Lulus”,“Gagal”)
Gabungkan df dan df2 berdasarkan kolom A sehingga setiap A memiliki keterangan (NA jika tidak ada).
Ubah data frame berikut dari long ke wide format:
data_long <- data.frame(
ID = c(1,1,2,2),
waktu = c("T1","T2","T1","T2"),
skor = c(80,90,70,75)
)Ubah data frame hasil dari Soal 7 kembali menjadi long format.
Diberikan data frame:
set.seed(123)
df3 <- data.frame(
Grup = rep(c("A","B"), each=4),
Nilai = sample(1:10, 8)
)Urutkan berdasarkan Grup lalu Nilai menurun.
Buat kolom Status dengan aturan: Nilai > 5 = "Baik", lainnya = "Kurang".
Jika terdapat data frame berikut:
df4 <- data.frame(
Kelas = rep(c("K1","K2","K3"), each=2),
Siswa = paste0("S",1:6),
Nilai = c(80,70,65,90,85,60)
)Ubah ke format wide dengan Kelas sebagai kolom dan Siswa sebagai baris.
Dari hasil wide tersebut, ubah kembali ke format long.
Tambahkan kolom Lulus dengan aturan: Nilai >= 75 = 1, lainnya = 0.