楼主: 奢香夫人1
9120 9

[问答] R语言中如何判断并删除合并相同行 [推广有奖]

  • 1关注
  • 0粉丝

高中生

47%

还不是VIP/贵宾

-

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

50论坛币
很多行很多列的数据

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

简单粗暴,直接上图。
          原始数据111.png    

         目的数据111.png                


                           

另,由于我做的是用shiny读取excel并进行相关操作,可能有的excel只有属性A重复,有的只有属性B重复,有的A和B都重复。如果能写成自动判断是否重复然后再进行相关操作就最好了。(注:只有SITE和Kind会出现重复,且ID是唯一识别标识)


求指教,谢谢!

最佳答案

jimaocai 查看完整内容

整体思路和原来一样,但是因为有两列,所以在by() 函数里对两行进行了计算,因为两行有有交互的关系,所以用了一个ifelse条件语句,意思是比如当一个重复组: --------------------- SITE Kind shanghai baby shanghai beauty ---------------------- baby和beauty,写成baby,beauty,但是该组前面一列里是shanghai shanghai,因为两个名字一样,所以不写成shanghai,shanghai 这个代码对大数据处理也应该还快的, ...
关键词:R语言 EXCEL Shiny exce xcel

回帖推荐

jimaocai 发表于7楼  查看完整内容

我吧代码该进了下,变的更简单明了了,对大数据的运算速度也应该有提高:整体的意思在每组重复行里,只取第一行,然后把SITE 和Kind的内容替代为所需的内容,再输出结果,如有疑问请留言
沙发
jimaocai 发表于 2017-8-1 21:12:33 |只看作者 |坛友微信交流群
整体思路和原来一样,但是因为有两列,所以在by() 函数里对两行进行了计算,因为两行有有交互的关系,所以用了一个ifelse条件语句,意思是比如当一个重复组:
---------------------
SITE      Kind
shanghai baby
shanghai beauty
----------------------
baby和beauty,写成baby,beauty,但是该组前面一列里是shanghai shanghai,因为两个名字一样,所以不写成shanghai,shanghai

  1. ##define data frame
  2. dat <- data.frame(ID=c(8,8,4,5,9,9),
  3.                   SITE=c('beijing','shanghai','beijing','beijing','shanghai','shanghai'),
  4.                   Kind=c(rep('baby',5),'beauty'),
  5.                   Volume=c(1,1,4,5,2,2))
  6. dat

  7. ##create new site names
  8. sub.dat <- dat[,c('ID','SITE','Kind')]
  9. site <- by(data=sub.dat,INDICES = sub.dat$ID,FUN = function(x){
  10.   a <- ifelse(length(unique(x$SITE))==1,
  11.               as.vector(x$SITE)[1],paste0(x$SITE,collapse = ','))
  12.   b <- ifelse(length(unique(x$Kind))==1,
  13.               as.vector(x$Kind)[1],paste0(x$Kind,collapse = ','))
  14.   data.frame(SITE=a,Kind=b)
  15. })

  16. site <- site[as.character(unique(sub.dat$ID))]
  17. site <- do.call(rbind,site)

  18. dat.new <- dat[match(rownames(site),dat$ID),]
  19. dat.new[,c('SITE','Kind')] <- site
  20. row.names(dat.new) <- NULL
  21. dat.new
复制代码

这个代码对大数据处理也应该还快的,比对每一行进行循环要快很多。
在这个网页上好像有些代码会自动被转换成数学公式,乱码主要发生在"x$SITE" 和 "x$Kind"上,中间是美元符号。

使用道具

藤椅
deem 学生认证  发表于 2017-8-1 21:45:15 |只看作者 |坛友微信交流群
比较笨的一个方法
  1. data <- data[order(data$id,data$site, data$kind), ]  # sort your dataset

  2. for i in (1:(nrow(data)-1){
  3.     if (data[i, "id"]==data[i+1, "id"] & data[i, "site"]!=data[i+1, "site"]){
  4.         data[i, "site"]<- paste(data[i, "site"], data[i+1, "site", sep=',')
  5.     }
  6.     if (data[i, "id"]==data[i+1, "id"] & data[i, "kind"]!=data[i+1, "kind"]){
  7.         data[i, "kind"]<- paste(data[i, "kind"], data[i+1, "kind", sep=',')
  8.     }
  9. }

  10. data <- dplyr::n_distinct(data, id)
复制代码


使用道具

板凳
奢香夫人1 发表于 2017-8-1 21:53:42 |只看作者 |坛友微信交流群
deem 发表于 2017-8-1 21:45
比较笨的一个方法
i是是什么呢? 我这边运行有错误   最好能给出完整代码  谢谢!

使用道具

报纸
deem 学生认证  发表于 2017-8-1 22:07:07 |只看作者 |坛友微信交流群
奢香夫人1 发表于 2017-8-1 21:53
i是是什么呢? 我这边运行有错误   最好能给出完整代码  谢谢!
括号放错位置了,是对所有的行进行循环。
这就是完整代码
  1. data <- data[order(data$id,data$site, data$kind), ]  # sort your dataset

  2. for (i in 1:(nrow(data)-1){
  3.     if (data[i, "id"]==data[i+1, "id"] & data[i, "site"]!=data[i+1, "site"]){
  4.         data[i, "site"]<- paste(data[i, "site"], data[i+1, "site", sep=',')
  5.     }
  6.     if (data[i, "id"]==data[i+1, "id"] & data[i, "kind"]!=data[i+1, "kind"]){
  7.         data[i, "kind"]<- paste(data[i, "kind"], data[i+1, "kind", sep=',')
  8.     }
  9. }

  10. data <- dplyr::n_distinct(data, id)
复制代码

使用道具

地板
deem 学生认证  发表于 2017-8-1 22:07:09 |只看作者 |坛友微信交流群
奢香夫人1 发表于 2017-8-1 21:53
i是是什么呢? 我这边运行有错误   最好能给出完整代码  谢谢!
括号放错位置了,是对所有的行进行循环。
这就是完整代码
  1. data <- data[order(data$id,data$site, data$kind), ]  # sort your dataset

  2. for (i in 1:(nrow(data)-1){
  3.     if (data[i, "id"]==data[i+1, "id"] & data[i, "site"]!=data[i+1, "site"]){
  4.         data[i, "site"]<- paste(data[i, "site"], data[i+1, "site", sep=',')
  5.     }
  6.     if (data[i, "id"]==data[i+1, "id"] & data[i, "kind"]!=data[i+1, "kind"]){
  7.         data[i, "kind"]<- paste(data[i, "kind"], data[i+1, "kind", sep=',')
  8.     }
  9. }

  10. data <- dplyr::n_distinct(data, id)
复制代码

使用道具

7
jimaocai 发表于 2017-8-1 22:54:55 |只看作者 |坛友微信交流群
我吧代码该进了下,变的更简单明了了,对大数据的运算速度也应该有提高:整体的意思在每组重复行里,只取第一行,然后把SITE 和Kind的内容替代为所需的内容,再输出结果,如有疑问请留言
  1. ##define data frame
  2. dat <- data.frame(ID=c(8,8,4,5,9,9),
  3.                   SITE=c('beijing','shanghai','beijing','beijing','shanghai','shanghai'),
  4.                   Kind=c(rep('baby',5),'beauty'),
  5.                   Volume=c(1,1,4,5,2,2))
  6. dat
  7. dat.new <- by(data = dat,INDICES = dat$ID,FUN = function(x){
  8.   site.new <- paste(unique(x$SITE),collapse = ',')
  9.   kind.new <- paste(unique(x$Kind),collapse = ',')
  10.   dat2 <- x[1,]
  11.   dat2$SITE <- site.new
  12.   dat2$Kind <- kind.new
  13.   dat2
  14. })

  15. dat.new <- dat.new[as.character(unique(dat$ID))]
  16. dat.new <- do.call(rbind,dat.new)
  17. rownames(dat.new) <- NULL
  18. dat.new
复制代码

使用道具

8
奢香夫人1 发表于 2017-8-2 09:51:52 |只看作者 |坛友微信交流群
jimaocai 发表于 2017-8-1 22:54
我吧代码该进了下,变的更简单明了了,对大数据的运算速度也应该有提高:整体的意思在每组重复行里,只取第 ...
谢谢。可以正常运行并且能达到功能了

使用道具

9
yupei123 发表于 2019-1-24 16:08:06 |只看作者 |坛友微信交流群
你好!请问by函数主要有什么功能呀?没有搜索到

使用道具

10
inno尧尧 学生认证  发表于 2020-1-7 21:53:25 |只看作者 |坛友微信交流群
jimaocai 发表于 2017-8-1 22:54
我吧代码该进了下,变的更简单明了了,对大数据的运算速度也应该有提高:整体的意思在每组重复行里,只取第 ...
好厉害!!!

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-30 16:25