【发布时间】:2015-09-18 09:00:49
【问题描述】:
我正在尝试基于文本搜索来收集目录信息。在Text列中搜索某个字符串,并将一些描述放入新列C_Organization。
这里是示例数据:
# load packages:
pacman::p_load("data.table",
"stringr")
# make sample data:
DE <- data.table(c("John", "Sussan", "Bill"),
c("Text contains MIT", "some text with Stanford University", "He graduated from Yale"))
colnames(DE) <- c("Name", "Text")
> DE
Name Text
1: John Text contains MIT
2: Sussan some text with Stanford University
3: Bill He graduated from Yale
搜索某个字符串并使用新列创建一个新的data.table:
mit <- DE[str_detect(DE$Text, "MIT"), .(Name, C_Organization = "MIT")]
yale <- DE[str_detect(DE$Text, "Yale"), .(Name, C_Organization = "Yale")]
stanford <- DE[str_detect(DE$Text, "Stanford"), .(Name, C_Organization = "Stanford")]
# bind them together:
combine_table <- rbind(mit, yale, stanford)
combine_table
Name C_Organization
1: John MIT
2: Bill Yale
3: Sussan Stanford
这种 pick-and-combine 方法效果很好,但似乎有点乏味。是否可以在data.table中一步完成?
编辑
由于我的数据分析能力差,数据不干净,我需要把问题说清楚:
-
真实数据有点复杂:
(1) 在某些情况下,一个人来自两个以上的组织,例如
Jack, UC Berkeley, Bell lab。和(2) 同一组织的同一个人出现在不同年份,如
Steven, MIT, 2011、Steven, MIT, 2014。 -
我想弄清楚:
(1) 每个组织有多少人。如果一个人属于多个组织,则将出现最多的组织设为他的组织。 (即按受欢迎程度。)例如,
John, MIT, AMS, Bell lab,如果MIT出现 30 次,AMS12 次,Bell lab26 次。然后将MIT设为他的组织。(2) 计算每年有多少人。这与我最初的问题没有直接关系,但为了以后的计算,我不想扔掉这些记录。
【问题讨论】:
-
你的意思是你有向量
v = c("MIT","Yale","Stanford")并且你想检索DE中的所有行在列text中有这个? -
是的。谢谢你的提问。你用更好的方式表达了我的问题。我应该提到这个向量在真实数据集中可能更长。
-
您的
pacman::电话会降低问题的重现性。你可以使用sapply(c("pkg1","pkg2"), require) -
@jangorecki 感谢您让我知道这一点。我一直试图找出如何简洁地写
require(pkg1), require(pkg2)...。sapply确实是个好主意,因为它不需要像pacman这样的额外包。 -
@Nick,如果每个名字有几个相同的学校,下面的显示是否满足你?
标签: r data.table