1830 9

[问答] 如何将下列代码变为循环,或者简化 [推广有奖]

  • 8关注
  • 1粉丝

博士生

78%

还不是VIP/贵宾

-

威望
0
论坛币
436 个
通用积分
0.0602
学术水平
5 点
热心指数
5 点
信用等级
0 点
经验
4549 点
帖子
164
精华
0
在线时间
407 小时
注册时间
2015-11-3
最后登录
2020-2-8

楼主
露露的家园2012 发表于 2018-6-6 21:12:17 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
  1. f1<-list()
  2. f2<-list()
  3. f3<-list()
  4. f4<-list()
  5. f5<-list()
  6. f6<-list()
  7. f7<-list()
  8. f8<-list()
  9. f9<-list()
  10. f10<-list()
  11. for (k in 1:10) {
  12.     f1[[k]]<- which(dta_couple[1,2]==dta_couple[k,4])
  13.     dta_couple[which(f1%in%1),]<-NA
  14.     f2[[k]]<-which(dta_couple[2,2]==dta_couple[k,4])
  15.     dta_couple[which(f2%in%1),]<-NA
  16.     f3[[k]]<-which(dta_couple[3,2]==dta_couple[k,4])
  17.     dta_couple[which(f3%in%1),]<-NA
  18.     f4[[k]]<-which(dta_couple[4,2]==dta_couple[k,4])
  19.     dta_couple[which(f4%in%1),]<-NA
  20.     f5[[k]]<-which(dta_couple[5,2]==dta_couple[k,4])
  21.     dta_couple[which(f5%in%1),]<-NA
  22.     f6[[k]]<-which(dta_couple[6,2]==dta_couple[k,4])
  23.     dta_couple[which(f6%in%1),]<-NA
  24.     f7[[k]]<-which(dta_couple[7,2]==dta_couple[k,4])
  25.     dta_couple[which(f7%in%1),]<-NA
  26.     f8[[k]]<-which(dta_couple[8,2]==dta_couple[k,4])
  27.     dta_couple[which(f8%in%1),]<-NA
  28.     f9[[k]]<-which(dta_couple[9,2]==dta_couple[k,4])
  29.     dta_couple[which(f9%in%1),]<-NA
  30.     f10[[k]]<-which(dta_couple[10,2]==dta_couple[k,4])
  31.     dta_couple[which(f10%in%1),]<-NA
  32. }

  33. dta_couple
复制代码
name1numname2num2
1

沈修

1

苏甜

2

2

苏甜

2

沈修

1

3

李志远

3

沈梅

4

4

沈梅

4

李志远

3

5

沈天逸

5

王丽丽

6

6

王丽丽

6

沈天逸

5

7

苏利天

7

李依琳

7

8

水泽

8

范容

9

9

范容

9

水泽

8

10

李依琳

10

苏利天

7

数据如上:

代码的目的就是要去掉重复的记录,这个重复是指的不管先后顺序,相同即为重复。
运行上述代码正常,得到的结果是:
name1numname2num2

1

NA

NA

2

苏甜

2

沈修

1

3

NA

NA

4

沈梅

4

李志远

3

5

NA

NA

6

王丽丽

6

沈天逸

5

7

NA

NA

8

NA

NA

9

范容

9

水泽

8

10

李依琳

10

苏利天

7

希望,大神能帮我简化上述代码,谢谢!
二维码

扫码加我 拉你入群

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

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


沙发
露露的家园2012 发表于 2018-6-6 21:13:52
        name1        num        name2        num2
1        NA        NA        NA        NA
2        苏甜        2        沈修        1
3        NA        NA        NA        NA
4        沈梅        4        李志远        3
5        NA        NA        NA        NA
6        王丽丽        6        沈天逸        5
7        NA        NA        NA        NA
8        NA        NA        NA        NA
9        范容        9        水泽        8
10        李依琳        10        苏利天        7

藤椅
jgchen1966 发表于 2018-6-6 22:43:19
用dplyr::distinct  ,重复的只保留一个,其他自然删除,很简单。。检查重复必备!!!

板凳
jgchen1966 发表于 2018-6-6 22:46:46
jgchen1966 发表于 2018-6-6 22:43
用dplyr::distinct  ,重复的只保留一个,其他自然删除,很简单。。检查重复必备!!!
使用R 的 朋友,对for(   ) {    }  要常“感恶心”,尽可能消除对它的任何“好感”!!!

报纸
hifinecon 发表于 2018-6-6 22:50:55
I agree! For loop is evil, if you can not master it.

地板
露露的家园2012 发表于 2018-6-7 09:41:09
jgchen1966 发表于 2018-6-6 22:43
用dplyr::distinct  ,重复的只保留一个,其他自然删除,很简单。。检查重复必备!!!
我指的重复,应该不是你理解的重复。数据中:
        name1        num        name2        num2
1        沈修              1          苏甜                 2
2        苏甜                 2        沈修           1
3        李志远        3        沈梅                 4
4        沈梅          4        李志远          3
上述数据中,第一行和第二行为重复数据。如果用你说的函数dinstinct函数去重,那结果就是没有重复数据,但是根据我的要求,上述数据中,是存在重复数据的,结果为:
1        沈修              1          苏甜                 2
3        李志远        3        沈梅                 4

所以,不知道你觉得用distinct函数怎么解决这个问题?
已有 1 人评分论坛币 学术水平 热心指数 收起 理由
jgchen1966 + 5 + 5 + 5 精彩帖子

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

7
cheetahfly 在职认证  发表于 2018-6-7 12:05:21
  1. library(tidyverse)
  2. library(stringr)
  3. filtered <- dta_couple %>%
  4.   select(ref, name1, name2) %>%
  5.   nest(name1, name2) %>%
  6.   mutate(ls = map(data, unlist),
  7.          ls = map(ls, sort),
  8.          ls = map(ls, str_c, collapse = "_")) %>%
  9.   select(-data) %>%
  10.   unnest() %>%
  11.   group_by(ls) %>%
  12.   filter(row_number() == max(row_number())) %>%
  13.   pull(ref)

  14. result <- filter(dta_couple, ref %in% filtered)
复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
jgchen1966 + 5 + 5 + 5 + 5 精彩帖子

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

8
露露的家园2012 发表于 2018-6-8 09:49:47
cheetahfly 发表于 2018-6-7 12:05
select(ref, name1, name2) %>%
不太明白,这里的ref是指的什么,而且程序报错了:
“Error in FUN(X[], ...) : object 'ref' not found”

9
cheetahfly 在职认证  发表于 2018-6-8 10:22:09
露露的家园2012 发表于 2018-6-8 09:49
select(ref, name1, name2) %>%
不太明白,这里的ref是指的什么,而且程序报错了:
“Error in FUN(X[ ...
疏忽了,我把你数据第一列:1,2,3,4,5,...编了一个列名:ref
如果没有,可以在最开始mutate(dta_couple, ref = row_number())就可以了

10
万人往LVR 在职认证  发表于 2018-6-8 17:55:43
新建一列,name1和name2排序后粘一起,用这列去重就好了
  1. library(dplyr)
  2. data <- data.frame(name1=c('a','b','c'),name2=c('b','a','a'),num=c(2,3,1),stringsAsFactors=F)
  3. for(i in 1:nrow(data)){
  4.         data$name12[i] <- sort(c(data$name1[i],data$name2[i])) %>% paste(collapse='')
  5. }
  6. distinct(data,name12,.keep_all=T)
复制代码

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

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