我有一个包含多个变量的数据框:
land_unit<-c("0.5ha", "hactares", "ha", "ha", "acre", "3ha",
"lima", "limas", "acre", "cunny", "6 cunnies")
我想写一个能为我整理这些数据的函数,因为我的数据框中有很多变量,格式相似。我希望该函数根据字符串中出现的第一个字母替换每个元素。例如,如果字符串中出现的第一个字母是“h”,我希望整个字符串替换为“ha”,如果“l”则替换为“lima”,如果“a”则为“acre”,如果“c”则为“卡尼岛”。
我对此进行了广泛的搜索,但找不到答案,但我知道必须有一个相对简单的解决方案。也许正在使用正则表达式?
非常感谢任何帮助。
答案 0 :(得分:1)
根据描述,可能会有所帮助。我们使用gsubfn
来匹配字母([^A-Za-z]*
)开头的零个或多个不是字母(^
)的字符,然后是作为一个组捕获的单个字母({{ 1}})后跟其他字符(([a-z])
)并用命名键/值.*
替换捕获组
list
答案 1 :(得分:1)
这也应该有效(使查找表硬编码并将数据与代码分离):
land_unit<-c("0.5ha", "hactares", "ha", "ha", "acre", "3ha",
"lima", "limas", "acre", "cunny", "6 cunnies")
library(stringr)
# define a lookup table, decouple the data
lookup_table <- data.frame(first.letter=c('h', 'l', 'a', 'c'),
replace.str=c('ha', 'lima', 'acre', 'kani'),
stringsAsFactors = FALSE)
# extract the matches
matches <- match(str_match(land_unit, "[^[:alpha:]]*([:alpha:]).*")[,2] , lookup_table[,1])
# replace from lookup table
ifelse(!is.na(matches), lookup_table[matches,2], land_unit)
# [1] "ha" "ha" "ha" "ha" "acre" "ha" "lima" "lima" "acre" "kani" "kani"