楼主: 蜗牛飞呀
1329 13

[有偿编程] R语言大规模数据批量替换 [推广有奖]

  • 0关注
  • 2粉丝

已卖:1份资源

讲师

21%

还不是VIP/贵宾

-

威望
0
论坛币
2061 个
通用积分
74.8250
学术水平
5 点
热心指数
5 点
信用等级
5 点
经验
6039 点
帖子
135
精华
0
在线时间
749 小时
注册时间
2017-4-27
最后登录
2026-1-2

楼主
蜗牛飞呀 发表于 2023-1-15 20:53:44 |AI写论文
20论坛币
请教一下论坛的各位老师,我现在想实现的一个功能是将机构批量定位到城市尺度。其中机构所在的城市保存在address_list数据表中,包含两列(applicant和city)。
举个例子:
Snipaste_2023-01-15_20-41-52.png
图1:示例效果(左边到右边)
Snipaste_2023-01-15_20-44-39.png
图2:address_list数据集
我尝试用过使用以下语句:
data$申请人 <- gsub(" ","",data$申请人,fixed = T) #去除空格
applicant <- stringr::str_split(data$申请人,";") #以分号为分隔符
applicant_new <- lapply(applicant, function(x) stri_replace_all_coll(x, address_list$applicant, address_list$city,vectorize_all=F))
运用最后一句来实现批量替换,但是这句语句我运行了一天一夜也没出来,主要是因为我的address_list文件和applicant文件都比较大,语句的运行效率比较低。所以想请教各位老师有没有好办法更有效率的实现上述效果。

Snipaste_2023-01-15_20-41-52.png (226.37 KB)

Snipaste_2023-01-15_20-41-52.png

最佳答案

abelus 查看完整内容

直接用match这种“底层”些的函数直接得到结果,思路上也许更加直观点。
关键词:R语言 大规模 address Dress list

沙发
abelus 发表于 2023-1-15 20:53:45
  1. pair2 <- pair1
  2. pair2$city.x <- addr$city[match(pair1$v1, addr$appl)]
  3. pair2$city.y <- addr$city[match(pair1$v2, addr$appl)]
  4. pair2$city <- paste(pair2$city.y, pair2$city.x, sep = ";")
  5. pair2
复制代码


直接用match这种“底层”些的函数直接得到结果,思路上也许更加直观点。
已有 1 人评分论坛币 收起 理由
cheetahfly + 10 热心帮助其他会员

总评分: 论坛币 + 10   查看全部评分

藤椅
sanjie27 发表于 2023-1-16 18:34:21
  1. library(readxl)
  2. library(tidyverse)

  3. df <- read_excel("1.xlsx")
  4. df


  5. df %>%
  6.   mutate_at(c("applicant", "city"), ~str_trim(.)) %>%
  7.   separate_rows(c(applicant, city), sep = ";")
复制代码

屏幕截图 2023-01-16 183327.png
已有 1 人评分论坛币 收起 理由
cheetahfly + 10 热心帮助其他会员

总评分: 论坛币 + 10   查看全部评分

板凳
sanjie27 发表于 2023-1-16 18:38:19
  1. library(readxl)
  2. library(tidyverse)

  3. df <- read_excel("1.xlsx")
  4. df


  5. df %>%
  6.   mutate_at(c("applicant", "city"), ~str_trim(.)) %>%
  7.   separate_rows(c(applicant, city), sep = ";")
复制代码
屏幕截图 2023-01-16 183327.png

报纸
蜗牛飞呀 发表于 2023-1-16 20:29:32
sanjie27 发表于 2023-1-16 18:38
老师,不好意思。我可能没表述好。我想实现的图1,左边到右边的效果。其中图1的左侧和图2的address_list是已知信息。然后去定位出city这一列。还是很谢谢老师。

地板
蜗牛飞呀 发表于 2023-1-16 20:38:26
  1. data$申请人 <- gsub(" ","",data$申请人,fixed = T)
  2. applicant <- stringr::str_split(data$申请人,";")
  3. library(stringi)
  4. applicant_new <- lapply(applicant, function(x) stri_replace_all_coll(x, address_list$applicant, address_list$city,vectorize_all=F))
复制代码

我想实现的是这个效果,但是不知道是数据量太大还是我的语句效率太低,运行了很多出不来结果。还请各位老师帮忙看看,谢谢。

7
abelus 发表于 2023-1-18 10:20:08
感觉LZ问题没描述清楚吧。
猜测还需要一张关联表的信息,所求结果表的第一列第一个字段,“浙江大学;浙江省农业科学院”,分号前后两个单位的信息是怎么关联起来的,还是说本身原始的信息就是如此。
所以感觉LZ是少给了一张表的信息。
如果输入表之一是LZ给出的表2,就是那个单位&城市的表,还需要一个输入表,应该就是单位1&单位2的表信息。
大胆猜测,就是单位1毕业的人到单位2去任职之类的,如果这个表有,得到LZ想要的信息是比较简单的。

另外,如果说数据量太大,可以描述下到底都有多少行,这种不太复杂的运算,百万行的处理通常是秒出结果,不用怀疑现在计算机&软件的基本功能。

8
蜗牛飞呀 发表于 2023-1-18 11:46:11
abelus 发表于 2023-1-18 10:20
感觉LZ问题没描述清楚吧。
猜测还需要一张关联表的信息,所求结果表的第一列第一个字段,“浙江大学;浙江 ...
老师你好,我现在的输入表是图1的第一列:浙江大学;浙江农业科学院。这一个信息是已知的(专利的联合申请);另外图2的address_list也是已知的(单位-城市的对应关系)。想要实现的是图1第一列+图2(两个已知信息)去定位出图1中第二列-->杭州;杭州这一列(结果列)。
核心目标是将单位组合上升为城市组合,将微观主体上升到城市尺度。
另外,我的图1第一列有62万个组合,另外address_list有48万个单位-城市对应关系。即将62万个目标组合,根据address_list中的对应关系(比如,浙江大学--杭州),将其转化为城市组合(结果列)。
不知道我有没有表述清楚,麻烦老师了。

9
abelus 发表于 2023-1-18 15:01:42
  1. addr <- data.frame(
  2.   appl = c('浙江省农业科学院', '上海交通大学', '浙江大学', '华东理工大学'),
  3.   city = c('杭州', '上海', '杭州', '上海')
  4. )

  5. pair <- data.frame(appr = c('浙江大学;浙江省农业科学院',
  6.                             '上海交通大学;华东理工大学'))

  7. pair1 <- pair
  8. pair1$v1 <- unlist(lapply(strsplit(pair1$appr, ';'), function(x) x[1]))
  9. pair1$v2 <- unlist(lapply(strsplit(pair1$appr, ';'), function(x) x[2]))

  10. pair2 <- merge(pair1, addr, by.x = 'v1', by.y = 'appl', all.x = T)
  11. pair2 <- merge(pair2, addr, by.x = 'v2', by.y = 'appl', all.x = T)
  12. pair2$city <- paste(pair2$city.y, pair2$city.x, sep = ";")
  13. pair2
复制代码

10
abelus 发表于 2023-1-18 15:04:55
> pair2[c('appr', 'city')]
                       appr      city
1 上海交通大学;华东理工大学 上海;上海
2 浙江大学;浙江省农业科学院 杭州;杭州

大概是这么个结果吧。
也可以用tidyverse的代码来弄,写的会更整洁精炼点。
如果单位OR城市名不规范,需要先搞规范才能匹配起来。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-31 04:17