匹配列表项以自动更新R中的空字段

时间:2017-10-28 08:46:02

标签: r

我有一些汉字(中文)字符及其匹配的韩文(韩文)发音。

install.packages("searchable") 
require(searchable)

kotr <-
new("Searchable"
    , .Data = structure(list(zh = structure(c(22L, 5L, 9L, 32L, 12L, 31L, 25L, 
17L, 19L, 15L, 29L, 10L, 13L, 1L, 4L, 52L, 51L, 39L, 54L, 41L, 
12L, 46L, 50L, 49L, 42L, 43L, 40L, 48L, 56L, 44L, 45L, 55L, 59L, 
62L, 64L, 60L, 63L, 65L, 58L, 68L, 75L, 74L, 73L, 57L, 72L, 71L, 
70L, 69L, 78L, 86L, 76L, 80L, 93L, 88L, 90L, 98L, 103L, 94L, 
100L, 99L, 108L, 106L, 109L, 39L, 111L, 115L, 113L, 117L, 114L, 
120L, 118L, 130L, 128L, 123L, 124L, 126L, 132L, 134L, 138L, 133L, 
145L, 149L, 143L, 147L, 156L, 155L, 157L, 154L, 151L, 153L, 152L, 
158L, 150L, 162L, 168L, 166L, 164L, 161L, 176L, 178L, 179L, 171L, 
172L, 170L, 184L, 185L, 181L, 194L, 186L, 187L, 189L, 192L, 200L, 
199L, 198L, 202L, 203L, 205L, 211L, 212L, 216L, 213L, 210L, 208L, 
224L, 221L, 229L, 230L, 227L, 223L, 225L, 220L, 219L, 232L, 231L, 
233L, 236L, 238L, 248L, 203L, 242L, 249L, 254L, 252L, 255L, 256L, 
251L, 245L, 202L, 257L, 262L, 260L, 263L, 267L, 266L, 265L, 270L, 
272L, 276L, 274L, 192L, 275L, 281L, 297L, 289L, 288L, 290L, 293L, 
300L, 287L, 278L, 296L, 294L, 295L, 292L, 283L, 284L, 298L, 280L, 
285L, 286L, 282L, 279L, 291L, 299L), .Label = c("八榖", "北斗", 
"北極", "傳舍", "大理", "勾陳", "華蓋", "六甲", "內廚", 
"內階", "女史", "三公", "三師", "尚書", "勢", "四輔", 
"太陽守", "太乙(太一)", "太尊", "天棓", "天廚", 
"天床", "天皇大帝", "天牢", "天理", "天槍", "天乙(天一)", 
"天柱", "文昌", "五帝內座", "相", "玄戈", "陰德", 
"御女[紫微]", "柱史", "紫微右垣", "紫微左垣", "常陳", 
"從官", "虎賁", "九卿", "郎將", "郎位", "靈台", "明堂", 
"內屏", "三台", "少微", "太微右垣", "太微左垣", 
"太子[太微]", "五帝座", "五諸侯", "幸臣", "謁者", 
"長垣", "帛度", "車肆", "帝座", "斗[天市]", "貫索", 
"候", "斛", "宦者", "列肆", "女床", "七公", "市樓", 
"天紀", "天市右垣", "天市左垣", "屠肆", "宗", "宗人", 
"宗正", "衡", "角", "進賢", "庫樓", "南門", "平", 
"平道", "天門", "天田[角]", "周鼎", "柱[角]", "大角", 
"頓頑", "亢", "陽門", "右攝提", "折威", "左攝提", 
"車騎", "氐", "帝席", "梗河", "亢池", "騎官", "騎陣將軍", 
"天輻", "天乳", "招搖", "陣車", "東咸", "罰", "房", 
"鍵閉", "日", "西咸", "積卒", "心", "傳說", "龜", 
"天江", "尾", "魚", "杵[箕]", "箕", "糠", "鱉", "斗", 
"狗", "狗國", "建", "農丈人", "天弁", "天雞", "天淵", 
"天龠", "河鼓", "漸臺", "九坎", "羅堰", "輦道", "牛", 
"天桴", "天田[牛]", "右旗", "織女", "左旗", "敗瓜", 
"扶筐", "瓠瓜", "離珠", "女", "十二國", "天津", "奚仲", 
"敗臼", "哭", "璃瑜", "泣", "司非", "司祿", "司命", 
"司危", "天壘城", "虛", "車府", "杵[危]", "蓋屋", 
"臼", "人", "天鉤", "天錢", "危", "虛梁", "造父", 
"八魁", "北落師門", "鈇鉞", "雷電", "壘壁陣", "室", 
"螣蛇", "天綱", "土公吏", "羽林軍", "壁", "鈇鑕", 
"霹靂", "天廄", "土公", "雲雨", "策", "附路", "閣道", 
"軍南門", "奎", "天溷", "土司空", "外屏", "王良", 
"婁", "天倉", "天大將軍", "天庾", "右更", "左更", 
"大陵", "積尸", "積水", "天船", "天廩", "天囷", "胃", 
"芻蒿", "卷舌", "礪石", "昴", "天阿", "天讒", "天陰", 
"天苑", "月", "畢", "參旗", "九斿", "九州殊口", "天高", 
"天關", "天潢", "天街", "天節", "天園", "威池", "五車", 
"諸王", "柱[畢]", "司怪", "觜", "座旗", "參", "廁", 
"軍井", "屏", "屎", "玉井", "北河", "弧矢", "積薪", 
"井", "軍市", "老人", "南河", "闕丘", "水府", "水位", 
"四瀆", "孫", "天狼", "天樽", "野雞", "丈人", "子", 
"爟", "鬼", "天狗", "天記", "天社", "外廚", "酒旗", 
"柳", "內平", "天稷", "天相", "星", "軒轅", "天廟", 
"張", "東甌", "翼", "軍門", "器府", "青丘", "軫", 
"波斯", "飛魚", "附白", "海山", "海石", "鶴", "火鳥", 
"夾白", "金魚", "孔雀", "馬腹", "馬尾", "蜜蜂", "南船", 
"鳥喙", "三角形", "蛇腹", "蛇首", "蛇尾", "十字架", 
"水委", "小斗", "異雀"), class = "factor"), ko = c("cheonsang", 
"daelii", "naeju", "hyeongwa", "samgong", "sang", "cheonlii", 
"taeyangsu", "taejon", "se", "munchang", "naegye", "samsa", "pal (gǔ)", 
"jeonsa", "ojejwa", "taejataemi", "jonggwan", "haengsin", "gugyeong", 
"samgong", "nae (píng)", "taemijwawon", "taemiuwon", "nangjang", 
"nangwi", "hobun", "somi", "jangwon", "lyeongyeongtae", "myeongdang", 
"alja", "jejwa", "hu", "hwanja", "ducheonsi", "gog", "lyeolyeolsa", 
"geochasa", "sinulu", "jongjeong", "jongin", "jong", "baegdotag", 
"dosa", "cheonsijwawon", "cheonsiuwon", "cheongi", "jinhyeon", 
"jugag", "hyeong", "nammun", "jwaseobje", "donwan", "yangmun", 
"hangji", "choyo", "geochagi", "gijinjanggun", "gigwan", "geonpye", 
"beol", "il", "jonggwan", "jeogjol", "cheongang", "jeonseolseyeol", 
"eo", "gugwigyun", "gang", "jeogi", "cheonyag", "cheongye", "gu", 
"gugug", "nongjangin", "jeomdae", "nalaeon", "cheonjeonu", "gugam", 
"liiju", "haejung", "bugwang", "sibigug", "samyeong", "sanoglog", 
"sawi", "sabi", "gog", "eub", "liyu", "cheonnuluseong", "paegu", 
"gaeog", "heolyangyang", "cheonjeon", "in", "jeowi", "deungsa", 
"togonglii", "ulimimgun", "baebugnaglagsamun", "buwol", "palgoe", 
"togong", "unu", "bujil", "wanglyangyang", "chaeg", "bunolo", 
"gunnammun", "tosagong", "jwagaenggyeong", "ugaenggyeong", "cheonyu", 
"jeogsi", "jeogsu", "cheonleum", "myo", "cheona", "wol", "cheoncham", 
"lyeoyeoseog", "chuho", "cheonga", "cheongo", "jewang", "jupil", 
"wiji", "cheonhwang", "cheonjeol", "gujusugu", "guyu", "ja", 
"sagoe", "jwagi", "gunjeong", "si", "subu", "jeogsu", "jeogsin", 
"suwi", "yagye", "cheonnanglang", "jangin", "ja", "son", "noloin", 
"jeogsi", "gwan", "oeju", "cheongi", "jugi", "cheonsang", "cheonjig", 
"naepyeong", "cheonmyo", "donggu", "(qīng)gu", "gunmun", "tosagong", 
"gibu", "haesan", "sibjaga", "mami", "mabog", "milbong", "samgaghyeong", 
"liijag", "gongjag", "pasa", "sami", "sabog", "sasu", "johwe", 
"hag", "hwajo", "suwi", "bubaeg", "hyeobbaeg", "geumgimeo", "haeseog", 
"bieo", "namseon", "sodu")), .Names = c("zh", "ko"), row.names = c(NA, 
185L))
    , type = "std"
    , options = list())

我希望将此列表中的韩语术语与以下列表中的术语相匹配,以便后者中的空字段可以自动更新。

data <-
structure(list(sno = list("ko001", "ko013", "ko016", "ko036", 
    "ko040", "ko041", "ko050", "ko053", "ko217", "ko218"), ko = c("JuJeong", 
"ChoYo", "HangJii", "Eo", "Kii", "WaeJeo", "Byeol", "JaamDae", 
"SamGong", "SamGong"), en = c("Holy Kettle", "Flutting Flag", 
"Oar for visitor", "Fish", "Winnow", "Outer Pestle", "Snapping Turtle", 
"River adjoining Tower", "Three Ministers", "Three Ministers"
), zh = c("", "", "", "", "", "", "", "", "三官", "三官"), 
    connect = list(c("2", "65721", "64792", "64792", "64852"), 
        c("1", "71075", "71075"), c("6", "69612", "70327", "70327", 
        "70400", "70400", "69389", "69389", "68707", "68707", 
        "68498", "68498", "69612"), c("1", "87569", "87569"), 
        c("3", "88635", "89931", "89931", "90185", "90185", "89642"
        ), c("2", "90830", "90414", "90414", "90568"), c("13", 
        "92953", "92308", "92308", "91494", "91494", "90982", 
        "90982", "90887", "90887", "91875", "91875", "92989", 
        "92989", "93174", "93174", "93825", "93825", "94114", 
        "94114", "94160", "94160", "94005", "94005", "93542", 
        "93542", "92953"), c("3", "93194", "92420", "92420", 
        "92791", "92791", "94481"), c("3", "66234", "64906", 
        "64906", "65550", "65550", "66234"), c("3", "52353", 
        "51448", "51448", "50933", "50933", "52353"))), .Names = c("sno", 
"ko", "en", "zh", "connect"), row.names = c(1L, 13L, 16L, 36L, 
40L, 41L, 50L, 53L, 217L, 218L), class = "data.frame")

这是我尝试过的,但下面的代码似乎都没有用。

lapply(kotr$ko, function(x) grep(x, data$ko))
lapply(data$ko, function(x) grep(x, kotr$ko))
mapply(agrep, kotr$ko, data$ko)
kotr$ko %in%  data$ko
data$ko %in% kotr$ko

然而,很明显有比赛。

grep("samgong", data$ko, ignore.case = T)
[1]  9 10
> grep("samgong", kotr$ko, ignore.case = T)
[1]  5 21

我哪里出错了,我应该怎么做呢?

匹配数据

@akrun:

我设法用这个来对数据进行分组:

z <- lapply(data$ko, function(x) grep(paste0("^", x, "$"), kotr@.Data$ko, ignore.case = TRUE))
z <- melt(z)

> kotr$zh[z$value]
[1] 招搖 魚   三公 三公 三公 三公
300 Levels: 八榖 北斗 北極 傳舍 大理 勾陳 ... 異雀
> data$zh[z$L1]
[1] ""     ""     "三官" "三官" "三官" "三官"

但是将kotr的值分配给data给出了一个奇怪的结果:

> data$zh[z$L1] <- kotr$zh[z$value]
> data$zh
 [1] ""    "103" ""    "117" ""    ""    ""   
 [8] ""    "12"  "12" 

1 个答案:

答案 0 :(得分:1)

根据?Searchable

  

签名'搜索'的方法

str(kotr)
#Formal class 'Searchable' [package "searchable"] with 3 slots
#  ..@ .Data  :List of 2
#  .. ..$ zh: Factor w/ 300 levels "八榖","北斗",..: 22 5 9 32 12 31 25 17 19 15 ...
#  .. ..$ ko: chr [1:185] "cheonsang" "daelii" "naeju" "hyeongwa" ...
#  .. ..- attr(*, "row.names")= int [1:185] 1 2 3 4 5 6 7 8 9 10 ...
#  ..@ type   : chr "std"
#  ..@ options: list()

所以我们需要使用@

进行提取
lapply(data$ko, function(x) grep(x, kotr@.Data$ko, ignore.case = TRUE))