楼主: 奢香夫人1
5830 11

[问答] R语言如何删除重复的行并合并属性 [推广有奖]

  • 1关注
  • 0粉丝

高中生

47%

还不是VIP/贵宾

-

威望
0
论坛币
934 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
213 点
帖子
14
精华
0
在线时间
41 小时
注册时间
2016-8-21
最后登录
2017-8-3

楼主
奢香夫人1 发表于 2017-7-29 17:32:20 |AI写论文
20论坛币
很多行很多列的数据

其中某两行除了一个属性不同,其他属性全部相同,请问该如何合并这两行呢

话不多说,具体见如下图

原始数据1.png

目的数据1.png

麻烦给出详细代码

PS,我要应用于R shiny中。其他都已写好,只需加代码进去了。你给的代码是否可以直接用?

最佳答案

jimaocai 查看完整内容

我写了一个代码,希望能帮到楼主。但是我不知道楼主的shiny app整体代码是怎样的,所以需要楼主看着怎么应用进去。在下列代码中只要把dat代替为shiny输入的一个数据data.frame就行,比如dat=input$dat, 或者dat=dat()之类的。 > ##define data frame > dat dat ID SITE Volume 1 1 beijing 1 2 1 shanghai 1 3 4 beijing 4 4 5 beijing 5 > > ##create new site names > sub.dat ...
关键词:R语言 Shiny Shin

沙发
jimaocai 发表于 2017-7-29 17:32:21
我写了一个代码,希望能帮到楼主。但是我不知道楼主的shiny app整体代码是怎样的,所以需要楼主看着怎么应用进去。在下列代码中只要把dat代替为shiny输入的一个数据data.frame就行,比如dat=input$dat, 或者dat=dat()之类的。

> ##define data frame
> dat <- data.frame(ID=c(1,1,4,5),SITE=c('beijing','shanghai','beijing','beijing'),Volume=c(1,1,4,5))
> dat
  ID     SITE Volume
1  1  beijing      1
2  1 shanghai      1
3  4  beijing      4
4  5  beijing      5
>
> ##create new site names
> sub.dat <- dat[,c('ID','SITE')]
> site <- by(data=sub.dat,INDICES = sub.dat$ID,FUN = function(x){
+   paste0(x$SITE,collapse = ',')
+ })
>
> site.idx <- which(colnames(dat)=='SITE')
>
> ##remove duplicated and put in the new site names
> dat.new <- dat[!duplicated(dat[,-site.idx]),]
> dat.new$SITE <- as.vector(site)
> dat.new
  ID             SITE Volume
1  1 beijing,shanghai      1
3  4          beijing      4
4  5          beijing      5
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 20 + 20 + 2 热心帮助其他会员
奢香夫人1 + 1 + 1 + 1 精彩帖子

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

藤椅
奢香夫人1 发表于 2017-7-29 20:46:55
jimaocai 发表于 2017-7-29 17:32
我写了一个代码,希望能帮到楼主。但是我不知道楼主的shiny app整体代码是怎样的,所以需要楼主看着怎么应用 ...
普通的是已经没问题啦,周一去用公司电脑用shiny搞一下没问题的话就发币了,有问题了再问问你。放心啦,绝不会辜负你的劳动成果

板凳
奢香夫人1 发表于 2017-7-29 20:58:04
jimaocai 发表于 2017-7-29 17:32
我写了一个代码,希望能帮到楼主。但是我不知道楼主的shiny app整体代码是怎样的,所以需要楼主看着怎么应用 ...
请问第一个出现的idx是什么呢?我这边变异错误,说找不到这个object   谢谢!

报纸
jimaocai 发表于 2017-7-29 21:50:22
奢香夫人1 发表于 2017-7-29 20:58
请问第一个出现的idx是什么呢?我这边变异错误,说找不到这个object   谢谢!
不好意思,写错了,这个是正确的代码,测试过能用了,把idx换成sub.dat。我主要是用了一个by()函数来从新整合beijing,shanghai的名字,楼主可以查看?by帮助文件来了解函数具体的应用方法

##define data frame
dat <- data.frame(ID=c(1,1,4,5),SITE=c('beijing','shanghai','beijing','beijing'),Volume=c(1,1,4,5))
dat


##create new site names
sub.dat <- dat[,c('ID','SITE')]
site <- by(data=sub.dat,INDICES = sub.dat$ID,FUN = function(x){
   paste0(x$SITE,collapse = ',')
})

site.idx <- which(colnames(dat)=='SITE')

##remove duplicated and put in the new site names
dat.new <- dat[!duplicated(dat[,-site.idx]),]
dat.new$SITE <- as.vector(site)
dat.new

地板
奢香夫人1 发表于 2017-7-29 22:41:25
jimaocai 发表于 2017-7-29 21:50
不好意思,写错了,这个是正确的代码,测试过能用了,把idx换成sub.dat。我主要是用了一个by()函数来从 ...
谢谢谢谢!我刚用了很多数据做测试,可是我又发现了一个问题哎

对于你的测试数据来说,当重复ID是最小的数的时候可以得到正确的输出。当重复ID的数字比较大不是最小的时候会出问题哎

不知道我有没有表达清楚

就是将你的数据ID=c(8,8,4,5)就会出问题哎,不知道是什么原因呢

蟹蟹啦!

7
jimaocai 发表于 2017-7-30 01:08:35
奢香夫人1 发表于 2017-7-29 22:41
谢谢谢谢!我刚用了很多数据做测试,可是我又发现了一个问题哎

对于你的测试数据来说,当重复ID是最小 ...
已经修改了代码,因为by()函数会自动把结果按照ID 从小到大排列,我加了一行代码
site <- site[as.character(unique(sub.dat$ID))]
把他按照看到的ID的顺序排列。 如果还有问题请在留言:
##define data frame
dat <- data.frame(ID=c(8,8,4,5),SITE=c('beijing','shanghai','beijing','beijing'),Volume=c(1,1,4,5))
dat

##create new site names
sub.dat <- dat[,c('ID','SITE')]
site <- by(data=sub.dat,INDICES = sub.dat$ID,FUN = function(x){
  paste0(x$SITE,collapse = ',')
})

site <- site[as.character(unique(sub.dat$ID))]

site.idx <- which(colnames(dat)=='SITE')

##remove duplicated and put in the new site names
dat.new <- dat[!duplicated(dat[,-site.idx]),]
dat.new$SITE <- as.vector(site)
dat.new

8
奢香夫人1 发表于 2017-7-31 12:13:25
jimaocai 发表于 2017-7-30 01:08
已经修改了代码,因为by()函数会自动把结果按照ID 从小到大排列,我加了一行代码
site
谢谢,运行上没有问题啦。差不多也解决了。还有一个小问题哈,我在shiny中用DT::dataTableOutput来显示时,当把重复行删除合并后,最前面的序号会断号,从合并的那里断开。

我说的是最前面的序号哈,不是ID。

比如原来的是1,2,3,4,5...将第一二行合并后会变成1,3,4,5...

请问这个有什么办法解决吗?


谢谢!

9
jimaocai 发表于 2017-7-31 18:02:14
奢香夫人1 发表于 2017-7-31 12:13
谢谢,运行上没有问题啦。差不多也解决了。还有一个小问题哈,我在shiny中用DT::dataTableOutput来显示时 ...
在得到dat.new之后再加一行代码
rownames(dat.new)<-NULL

应该就可以了。意思就是你把他原来的行的名称去掉,你试下。

10
奢香夫人1 发表于 2017-8-1 15:26:20 来自手机
jimaocai 发表于 2017-7-31 18:02
在得到dat.new之后再加一行代码
rownames(dat.new)
好的好的。解决啦,谢谢~

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-5 12:52