Di R, gunakan loop if dengan agrep untuk menetapkan nilai

Daftar polanya terlihat seperti:

pattern <- c('aaa','bbb','ccc','ddd')

X berasal dari df terlihat seperti:

df$X <- c('aaa-053','aaa-001','aab','bbb')

Apa yang saya coba lakukan: gunakan agrep untuk menemukan nama yang cocok dalam pola berdasarkan df$X, lalu berikan nilai ke kolom 'kolom2' yang ada berdasarkan hasil pencocokan, misalnya jika 'aaa-053' cocok dengan 'aaa' , maka 'aaa' akan menjadi nilai di 'kolom2', jika tidak cocok, kembalikan na di kolom tersebut.

for (i in 1:length(pattern)) {
 match <- agrep(pattern, df$X, ignore.case=TRUE, max=0)
 if agrep = TRUE {
   df$column2 <- pattern
 } else {df$column2 <- na
 }
}

Kolom2 ideal di df terlihat seperti:

'aaa','aaa',na,'bbb'

person onemikeone    schedule 19.03.2021    source sumber
comment
Menurut Anda apa yang seharusnya terjadi jika aaa cocok dengan aab Anda?   -  person r2evans    schedule 19.03.2021


Jawaban (1)


agrep dengan sendirinya tidak akan memberi Anda banyak hal untuk menentukan mana yang akan digunakan ketika kelipatannya cocok. Contohnya,

agrep(pattern[1], df$x)
# [1] 1 2 3

yang masuk akal untuk dua nilai pertama, tetapi nilai ketiga bukan nilai yang Anda harapkan. Demikian pula, mungkin saja ia memilih beberapa pola untuk string tertentu.

Berikut alternatifnya:

D <- adist(pattern, df$x, fixed = FALSE)
D
#      [,1] [,2] [,3] [,4]
# [1,]    0    0    1    3
# [2,]    3    3    2    0
# [3,]    3    3    3    3
# [4,]    3    3    3    3
D[D > 0] <- NA
D
#      [,1] [,2] [,3] [,4]
# [1,]    0    0   NA   NA
# [2,]   NA   NA   NA    0
# [3,]   NA   NA   NA   NA
# [4,]   NA   NA   NA   NA
apply(D, 2, function(z) which.min(z)[1])
# [1]  1  1 NA  2
pattern[apply(D, 2, function(z) which.min(z)[1])]
# [1] "aaa" "aaa" NA    "bbb"
person r2evans    schedule 19.03.2021
comment
Saya pikir ini berfungsi untuk data numerik, tetapi kondisi saya didasarkan pada nilai karakter, itulah sebabnya saya awalnya mencoba menggunakan agrep - person onemikeone; 29.03.2021
comment
Saya tidak tahu apa yang Anda maksud dengan hal itu. agrep bekerja pada string, bukan angka, seperti halnya adist. Inti dari jawaban ini adalah untuk (1) menunjukkan bahwa asumsi Anda tentang kecocokan tunggal salah; dan (2) menyarankan suatu metodologi untuk mencoba memitigasi kekurangan tersebut. Bagian numerik dari jawaban ini adalah mencari jarak terkecil antar string, yang menunjukkan kecocokan terbaik. Jika Anda ingin menghindari angka, saya sarankan Anda menggunakan data yang tidak memiliki risiko tumpang tindih seperti sampel Anda, atau merancang metode yang jauh lebih intuitif daripada pencocokan string fuzzy. Semoga beruntung! - person r2evans; 29.03.2021
comment
Perspektif lain: berdasarkan data sampel Anda, ini memberikan jawaban yang Anda harapkan, sebagai string. Apakah ada kondisi atau properti lain dari data yang membuat kode ini berfungsi buruk? Apakah ada data lain yang tidak berfungsi? Jika gagal dengan data Anda yang sebenarnya, maka Anda tidak dapat mengharapkan sesuatu yang lebih baik jika Anda tidak menyempurnakan pertanyaan Anda untuk menyertakan data sampel yang lebih representatif. - person r2evans; 29.03.2021