楼主: leo1122
5091 8

[有偿编程] 用R语言编程求三个xls表格中的交集部分,输出一个新的表格 [推广有奖]

  • 0关注
  • 0粉丝

硕士生

18%

还不是VIP/贵宾

-

威望
0
论坛币
1522 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
642 点
帖子
25
精华
0
在线时间
238 小时
注册时间
2012-4-25
最后登录
2024-10-3

楼主
leo1122 发表于 2016-11-14 08:44:45 |AI写论文
10论坛币
现在有三个xls表格,表格1
姓名性别年龄
张三

16

李四

17

王二

19

小王

17

小明

18

小张

16

表格2
姓名身高体重
张三

1.51

50

李四

1.52

51

王二

1.53

52

小李

1.55

54

表格3
姓名语文数学
张三

70

80

李四

71

82

小李

72

84

小元

73

86



用R语言编程求三个xls表格中的交集部分,输出一个新的表格4
表格4
姓名性别年龄身高体重语文数学
张三

16

1.51

50

70

80

李四

16

1.52

51

71

82



希望各位编程高手多多帮助,多谢!




最佳答案

飞天玄舞6 查看完整内容

fir 姓名 性别 年龄 1 张三 男 16 2 李四 男 17 3 王二 男 19 4 小王 男 17 5 小明 女 18 6 小张 女 16 sec 姓名 身高 体重 1 张三 151 50 2 李四 152 51 3 王二 153 52 4 小李 155 54 thi 姓名 语文 数学 1 张三 70 80 2 李四 71 82 3 小李 72 84 4 小圆 73 86 a 姓名 性别 年龄 身高 体重 1 李四 男 17 152 51 2 王二 男 19 ...
关键词:R语言编程 语言编程 R语言 xls 编程高手 语言编程 数学 姓名 语文

沙发
飞天玄舞6 在职认证  发表于 2016-11-14 08:44:46
ly_0 发表于 2016-11-14 17:24
用两遍merge()函数,顺便问一下,为什么我的R里所有中文都是乱码?【同为新手】
  1. fir <- read.csv("fir.csv",stringsAsFactors = F)
  2. sec <-read.csv("sec.csv",stringsAsFactors = F)
  3. thi <- read.csv("thi.csv",stringsAsFactors = F)
  4. a <-merge(fir,sec,by="姓名",all=F)
  5. b <- merge(a,thi, by="姓名",all=F)
复制代码
fir
  姓名 性别 年龄
1 张三   男   16
2 李四   男   17
3 王二   男   19
4 小王   男   17
5 小明   女   18
6 小张   女   16
sec
  姓名 身高 体重
1 张三  151   50
2 李四  152   51
3 王二  153   52
4 小李  155   54
thi
  姓名 语文 数学
1 张三   70   80
2 李四   71   82
3 小李   72   84
4 小圆   73   86
a
  姓名 性别 年龄 身高 体重
1 李四   男   17  152   51
2 王二   男   19  153   52
3 张三   男   16  151   50
b
  姓名 性别 年龄 身高 体重 语文 数学
1 李四   男   17  152   51   71   82
2 张三   男   16  151   50   70   80

藤椅
飞天玄舞6 在职认证  发表于 2016-11-14 11:39:46
用fir、sec和thi分别代表1,2,3个数据,则:
  1. fir <- read.csv("fir.csv",stringsAsFactors = F)
  2. sec <-read.csv("sec.csv",stringsAsFactors = F)
  3. thi <- read.csv("thi.csv",stringsAsFactors = F)
  4. fun <- function(fir,sec,thi){
  5. for(i in 1:length(fir$姓名)){
  6.   for(j in 1:length(sec$姓名)){
  7.     for(k in 1:length(thi$姓名)){
  8.       if(fir$姓名[i]==sec$姓名[j] & sec$姓名[j]==thi$姓名[k]){
  9.         p <- cbind(fir[i,],sec[j,][,-1],thi[k,][,-1])

  10.       }
  11.     }
  12.   }
  13.   return(p)
  14. }
  15. }
复制代码

但是不知为什么,只是出来一行,还有一行数据没有检索出,希望有网友能指出错误并提出解决的办法.
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
leo1122 + 5 + 1 + 1 + 1 精彩帖子

总评分: 论坛币 + 5  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

strive for the best, prepare for the worst.

板凳
leo1122 发表于 2016-11-14 15:47:44
飞天玄舞6 发表于 2016-11-14 11:39
用fir、sec和thi分别代表1,2,3个数据,则:

但是不知为什么,只是出来一行,还有一行数据没有检索出,希 ...
非常感谢,这个脚本的确只能罗列搜索一个结果,还有没有函数把所有的都能罗列下来呢?导致这种结果好像是生成的i一直替换前一个结果而导致只显示最后一个结果,不能显示所有结果,感觉用list函数可以弥补这个缺点,但是一直没成功,不知道还有没有更好的函数解决这个问题

报纸
ly_0 发表于 2016-11-14 17:24:13
用两遍merge()函数,顺便问一下,为什么我的R里所有中文都是乱码?【同为新手】
  1. fir <- read.xlsx("test.xlsx",1,h=T)
  2. sec <- read.xlsx("test.xlsx",2,h=T)
  3. thi <- read.xlsx("test.xlsx",3,h=T)
  4. fir
  5.    Name Gender Age
  6. 1 zhang      1  16
  7. 2    li      1  17
  8. 3  wang      2  18
  9. sec
  10.    Name Height weight
  11. 1 zhang   1.51     50
  12. 2    li   1.52     51
  13. 3  wang   1.53     52
  14. thi
  15.    Name Math Language
  16. 1 zhang   90       85
  17. 2    li   91       86
  18. 3  wang   92       87
  19. com_0 <- merge(fir,sec,by="Name",all=F)
  20. com_0
  21.    Name Gender Age Height weight
  22. 1    li      1  17   1.52     51
  23. 2  wang      2  18   1.53     52
  24. 3 zhang      1  16   1.51     50
  25. com_1 <- merge(com_0,thi,by="Name",all=F)
  26. com_1
  27.    Name Gender Age Height weight Math Language
  28. 1    li      1  17   1.52     51   91       86
  29. 2  wang      2  18   1.53     52   92       87
  30. 3 zhang      1  16   1.51     50   90       85
复制代码


也可以在R中调用sqldf包用sql去做,但是太麻烦了。。。。
已有 2 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
leo1122 + 5 + 1 + 1 + 1 精彩帖子
飞天玄舞6 + 5 + 1 + 1 观点有启发

总评分: 论坛币 + 10  学术水平 + 2  热心指数 + 2  信用等级 + 1   查看全部评分

地板
飞天玄舞6 在职认证  发表于 2016-11-14 18:12:36
ly_0 发表于 2016-11-14 17:24
用两遍merge()函数,顺便问一下,为什么我的R里所有中文都是乱码?【同为新手】
你可能字符串变成因子了,试试读取文件的时候加上stringsAsFactors=F.

7
leo1122 发表于 2016-11-14 23:05:22
谢谢各位,辛苦啦!

8
jameschin007 发表于 2016-11-15 22:54:41
作为IT出身的, 这种问题,用sqldf 最简单。 三个数据集 分别是 a,b,c   
select a.姓名, a.col2, a.col3, b.col2,b.col3, c.col2,c.col from a join b on a.name=b.name join c on a.name=c.name

9
iristaw 发表于 2017-8-3 14:36:33
其实可以不用写诸如merge循环的程序,可以用R里的dplyr包,里面的join系列,提供了管道函数:%>%,通过%>%将上一个函数的输出作为下一个函数的输入,是dplyr包中特有的管道函数。
详细方法如下:
如果你要实现三个表合并(按照某列值匹配)
表格4 <- inner_join(x = 表格1, y = 表格2, by = '匹配列名') %>% inner_join(表格3,by='匹配列名')
若实现其他匹配,用其他join组合即可。

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

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