草庐IT

关于 regex:grepl() 和 lapply 填充缺失值

codeneng 2023-03-28 原文

grepl() and lapply to fill missing values

我以以下数据为例:

1
fruit.region <- data.frame(full =c("US red apple","bombay Asia mango","gold kiwi New Zealand"), name = c("apple","mango","kiwi"), country = c("US","Asia","New Zealand"), type = c("red","bombay","gold"))

我希望 R 能够查看 "full" (name) 列中没有 "name"、"country" 和 "type\\ 值的其他项目"并查看它们是否与其他项目匹配。例如,如果 full 的第 4 行带有"bombay US mango",它将能够识别出国家应该读作 US,bombay 应该在 type 下,mango 应该在 name 下。

这是我目前所拥有的,它只是(逻辑上)识别项目匹配的位置:

1
2
3
4
5
6
7
new.entry <- c("bombay US mango")
split.new.entry <- strsplit(new.entry,"")

lapply(split.new.entry, function(x){
 check = grepl(x, fruit.region, ignore.case=TRUE)
 print(check)
})

我有点停滞不前..我已经阅读了许多正则表达式帖子和 grepl 上的 r 帮助指南,但无法找到一个很好的解决方案。我所拥有的不能完全识别逻辑"匹配"向量,因此我无法对不同元素进行子集化并使用 if 语句连接。理想情况下,我希望能够以 data.table 形式替换这些元素,因为我的 fruit.region 实际上会在数据表中。有人对最佳方法有任何建议吗?

  • 请将您的输入数据框格式化为表格,然后向我们展示您想要的确切输出。


使用 stringr 库中的 str_detect 函数。这给出了一个列表,准备 rbind:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
library(stringr)
addnewrow <- function(newfruit){
  z<-lapply(fruit.region[,2:4], function(x) x[str_detect(new.entry, x)])
  z$full <- newfruit
  z
}
addnewrow(new.entry)

$name
[1]"mango"

$country
[1]"US"

$type
[1]"bombay"

$full
[1]"bombay US mango"

下一步将取决于您想要的结果 - 如果您只想添加一个,请尝试:

1
rbind(fruit.region, addnewrow(new.entry))

如果你有很多:

1
2
z <- do.call(rbind, lapply(c(new.entry, new.entry), addnewrow))
rbind(fruit.region, z)

请确保您的列是字符优先:

1
fruit.region[] <- lapply(fruit.region, as.character)

  • 谢谢你,杰里米 - 这很有帮助。一项后续行动:当 new.entry 是一个行项目时,我似乎在添加值时已经弄清楚了。当我尝试添加类似以下内容的内容时: new.entry <- c("apple, Asia, gold","mango US bombay","kiwi, Asia, red") 然后运行: z <- do.call(rbind, lapply(new.entry, addnewrow)) rbind(fruit.region, z) 我最终得到的输出没有正确地将新项目放入正确的类别中。你知道我做错了什么吗??谢谢
  • 您应该将您接受的答案标记为正确,并且可能也会对其进行投票。人们喜欢因为他们的帮助而获得奖励。

有关关于 regex:grepl() 和 lapply 填充缺失值的更多相关文章

  1. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  2. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  3. ruby-on-rails - 缺失区域;使用 :region option or export region name to ENV ['AWS_REGION' ] - 2

    我知道还有其他相同的问题,但他们没有解决我的问题。我不断收到错误:Aws::Errors::MissingRegionErrorinBooksController#create,缺少区域;使用:region选项或将区域名称导出到ENV['AWS_REGION']。但是,这是我的配置开发.rb:config.paperclip_defaults={storage::s3,s3_host_name:"s3-us-west-2.amazonaws.com",s3_credentials:{bucket:ENV['AWS_BUCKET'],access_key_id:ENV['AWS_ACCE

  4. ruby-on-rails - 关于 Ruby 的一般问题 - 2

    我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia

  5. ruby - 如何用递增的值填充数组 Ruby - 2

    我正在尝试解决http://projecteuler.net/problem=1.我想创建一个方法,它接受一个整数,然后创建一个包含它前面的所有整数的数组,并将整数本身作为数组中的值。以下是我目前所拥有的。代码不起作用。defmake_array(num)numbers=Array.newnumcount=1numbers.eachdo|number|numbers 最佳答案 (1..num).to_a是您在Ruby中需要做的全部。1..num将创建一个Range对象,以1开始并以任意值num结束是。Range对象有to_a方法通过

  6. ruby-on-rails - 尝试为 Rails 中的用户名验证编写 REGEX - 2

    我正在尝试用Ruby(Rails)编写一个正则表达式,以便用户名的字符仅包含数字和字母(也没有空格)。我有这个正则表达式,/^[a-zA-Z0-9]+$/,但它似乎没有用,我在Rails中收到一个错误,说“The如果正则表达式使用多行anchor(^或$),这可能会带来安全风险。您是要使用\A和\z,还是忘记添加:multiline=>true选项?"我的user.rb模型中此实现的完整代码是:classUser我做错了什么以及如何修复此正则表达式,使其仅对数字和字母有效而不对空格有效?谢谢。 最佳答案 简短回答:使用/\A[a-z

  7. ruby-on-rails - RoR中是否有任何内置方法可以为整数填充零? - 2

    如果我想要“00001”而不是“1”,除了我自己写填零方法之外,有没有内置的方法可以帮助我为整数填零? 最佳答案 puts"%05d"%1#00001参见:String::%,Kernel::sprintf这是正在发生的事情。%左侧的"%05d"是C风格的格式说明符。%右边的变量就是要格式化的东西。格式说明符可以像这样解码:%-格式说明符的开头0-用前导零填充5-长度为5个字符d-被格式化的是一个整数如果你要格式化多个东西,你会把它们放在一个数组中:"%d-%s"%[1,"One"]#=>1-one

  8. Ruby Regex,获取所有可能的匹配项(不截断字符串) - 2

    我遇到了ruby​​正则表达式的问题。我需要找到所有(可能重叠的)匹配项。这是问题的简化:#Simpleexample"Hey".scan(/../)=>["He"]#Actualresults#Withoverlappingmatchestheresultshouldbe=>["He"],["ey"]我尝试执行并获得所有结果的正则表达式如下所示:"aaaaaa".scan(/^(..+)\1+$/)#Thislooksformultiplesof(here)"a"biggerthanonethat"fills"theentirestring."aa"*3=>true,"aaa"*2=

  9. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

  10. ruby - 关于 Ruby 中 Dir[] 和 File.join() 的混淆 - 2

    我在Ruby中遇到了一个关于Dir[]和File.join()的简单程序,blobs_dir='/path/to/dir'Dir[File.join(blobs_dir,"**","*")].eachdo|file|FileUtils.rm_rf(file)ifFile.symlink?(file)我有两个困惑:首先,File.join(@blobs_dir,"**","*")中的第二个和第三个参数是什么意思?其次,Dir[]在Ruby中有什么用?我只知道它等价于Dir.glob(),但是,我对Dir.glob()确实不是很清楚。 最佳答案

随机推荐