<- data.frame(x = 1:5, y = 6:10)
df df
x y
1 1 6
2 2 7
3 3 8
4 4 9
5 5 10
$z <- df$x + df$y
df 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.
<- data.frame(x = 1:5, y = 6:10)
df df
x y
1 1 6
2 2 7
3 3 8
4 4 9
5 5 10
$z <- df$x + df$y
df 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()
<- data.frame(A=c("A1","A2","A1","A3"), nilai=c(10,20,15,25))
df df
A nilai
1 A1 10
2 A2 20
3 A1 15
4 A3 25
<- df[df$A=="A1", ] # pilih baris dengan A = "A1"
subset1 subset1
A nilai
1 A1 10
3 A1 15
<- df[df$nilai > 15, ] # pilih baris dengan nilai > 15
subset2 subset2
A nilai
2 A2 20
4 A3 25
<- df[df$A %in% c("A1","A3"), ]
subset3 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
<- data.frame(x=c(3,1,2), y=c(10,30,20))
df <- df[order(df$x), ] # urutkan berdasarkan x (ascending)
df_sorted df_sorted
x y
2 1 30
3 2 20
1 3 10
<- df[order(df$y, decreasing=T), ] # urutkan y (descending)
df_sorted_desc 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.
<- 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 df
A nilai baru
1 A1 10 1
2 A2 20 0
3 A1 15 1
4 A3 25 0
ifelse()
$baru <- ifelse(df$nilai <= 15, "Rendah", "Tinggi")
df df
A nilai baru
1 A1 10 Rendah
2 A2 20 Tinggi
3 A1 15 Rendah
4 A3 25 Tinggi
recode()
dari package car
library(car)
Loading required package: carData
$kategori <- recode(df$nilai, "10:15='A'; 20:25='B'; else='C'")
df 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
<- data.frame(ID=c(1,2,3), x=c(10,20,30))
df1 <- data.frame(ID=c(2,3,4), y=c(200,300,400))
df2
# 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.frame(
data_long 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
<- reshape(data_long, idvar="ID", timevar="waktu", direction="wide")
wide wide
ID skor.T1 skor.T2
1 1 80 90
3 2 70 75
<- reshape(wide, varying=list(c("skor.T1","skor.T2")),
long 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.frame(
data_long 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)
<- data.frame(
df3 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:
<- data.frame(
df4 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.