楼主: 水舞者
5344 3

[问答] 合并两个dataframe [推广有奖]

  • 0关注
  • 2粉丝

本科生

48%

还不是VIP/贵宾

-

威望
0
论坛币
42 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
2 点
经验
1489 点
帖子
67
精华
0
在线时间
62 小时
注册时间
2015-6-7
最后登录
2021-7-22

楼主
水舞者 发表于 2016-6-15 15:10:30 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
ladies and gentlemen,好久不见!我又来问问题了。现在有两个dataframe:

> head(a)

   chr   start     end     dhs

1 chr1 1911945 1912455 DHS1401

2 chr1 1912485 1912835 DHS1402

3 chr1 1914165 1914395 DHS1405

4 chr1 2200820 2201195 DHS1805

5 chr1 2903485 2903635 DHS2770

6 chr1 3788105 3788255 DHS4214

> head(b)

   chr   start     end     dhs category target_gene

1 chr1 1911945 1912455 DHS1401    local    KIAA1751

2 chr1 1912485 1912835 DHS1402    local    KIAA1751

3 chr1 1914165 1914395 DHS1405    local    KIAA1751

4 chr1 2200820 2201195 DHS1805    local         SKI

5 chr1 2903485 2903635 DHS2770   distal      ACTRT2

6 chr1 3788105 3788255 DHS4214    local        DFFB

a包含b,我现在要做这样一件事情:如果a中有dhs在b中,则输出b的这一行,否则就输出a的这一行,后面两列就输出NA值,类似于这种:

> head(c,10)

    chr   start     end     dhs category target_gene

1  chr1 1911945 1912455 DHS1401    local    KIAA1751

2  chr1 1912485 1912835 DHS1402    local    KIAA1751

3  chr1 1914165 1914395 DHS1405    local    KIAA1751

4  chr1 2200820 2201195 DHS1805    local         SKI

5  chr1 2903485 2903635 DHS2770   distal      ACTRT2

6  chr1 3788105 3788255 DHS4214    local        DFFB

7  chr1 4815360 4816015 DHS5346    local       AJAP1

8  chr1 5910045 5910490 DHS6382     <NA>        <NA>

81 chr1 6332640 6332935 DHS7033    local       ACOT7

9  chr1 7409425 7409895 DHS8350    local      CAMTA1

我自己写的程序是这样的:

colnames(a)<-c("chr","start","end","dhs")

colnames(b)<-c("chr","start","end","dhs","category","target_gene")

if(as.character(a[1,4]) %in% b[,4]){

        c<-b[match(as.character(a[1,4]),b[,4]),]

}else{

        c<-cbind(a[1,],NA,NA)

}

line<-NULL

for (i in 2:nrow(a)){

        if(as.character(a[i,4]) %in% b[,4]){

                line<-b[match(as.character(a[i,4]),b[,4]),]

        }else{

                line<-cbind(a[i,],category=NA,target_gene=NA)

        }

        c<-rbind(c,line)

}


我总感觉这么写很麻烦,不符合R的宗旨,想问问有没有什么简便的写法,浪费各位的时间了,多谢!!!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Dataframe Frame Data Fram FRA category local start 好久不见

沙发
万人往LVR 在职认证  发表于 2016-6-15 16:17:11
  1. a$category <- NA
  2. a$target_gene <- NA
  3. c <- rbind(b,a)
  4. d <- c[!duplicated(c$dhs),]
复制代码

把b和a接在一起,对dhs去重,由于b在上面,所以b存在dhs的就不取a了
已有 2 人评分论坛币 热心指数 收起 理由
ryoeng + 1 热心帮助其他会员
jiangbeilu + 10 精彩帖子

总评分: 论坛币 + 10  热心指数 + 1   查看全部评分

藤椅
zhaoyuxin7 发表于 2016-6-15 16:27:54
dplyr包里面的left_join应该可以完美解决
已有 2 人评分论坛币 热心指数 收起 理由
ryoeng + 1 热心帮助其他会员
jiangbeilu + 10 精彩帖子

总评分: 论坛币 + 10  热心指数 + 1   查看全部评分

板凳
水舞者 发表于 2016-6-15 17:04:59
万人往LVR 发表于 2016-6-15 16:17
把b和a接在一起,对dhs去重,由于b在上面,所以b存在dhs的就不取a了
赞&#128077;谢谢~

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 13:30