楼主: hqs811
2073 10

[编程问题求助] 求助如何实现一个程序,比较复杂 [推广有奖]

  • 3关注
  • 0粉丝

硕士生

59%

还不是VIP/贵宾

-

威望
0
论坛币
1926 个
通用积分
28.2825
学术水平
1 点
热心指数
1 点
信用等级
1 点
经验
1051 点
帖子
76
精华
0
在线时间
210 小时
注册时间
2011-10-11
最后登录
2024-3-12

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
现有数据如下, 三个column (title,authors(不同的name用|隔开),number_authors)

Title                      Authors                                                    Number_authors
Title 1               Name A | Name B                                                 2
Title 2               Name A | Name B  | Name C                                  3
Title 3               Name A | Name C  | Name E | Name Z                     4
TITLE 4                NAME A                                                           1
TITLE 5                   NAME F | NAME Z                                            2
..
大概有20000个observations,其中
1. title是unique的
2. number_authors 取值从1-200.


现在想做的是,对每一个observation生成一系列variables(5个):at_least_x_authors_repeat. X从1-5取整数值. 变量取值0或1
也就是:at_least_1_authors_repeat; at_least_2_authors_repeat;at_least_3_authors_repeat;at_least_4_authors_repeat;
at_least_5_authors_repeat.
变量描述了在这组数据中有多少作者是重复的


变量举例描述: 比如at_least_2_authors_repeat:title3有name A, name C, name E, name Z 四个author 如果其中至少两个名字在别的observation里也同时出现过,那么at_least_2_authors_repeat = 1, 如果任意两个名字在其他observation里都没有同时出现过,那么at_least_2_authors_repeat = 0.
从目前数据看来,A 和 C 在title 2 中同时出现过,所以title 2 和title3 的at_least_2_authors_repeat取值为1.
同样的,对于at_least_3_authors_repeat,我们需要检验至少三个.

这个程序应该怎样实现的?小弟已经冥思苦想很久了,仍然没有头绪,希望各位指点一二,谢谢!

二维码

扫码加我 拉你入群

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

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

关键词:如何实现 observations observation Variables observat title 程序 如何

沙发
iabc 发表于 2014-8-19 11:27:15 来自手机 |只看作者 |坛友微信交流群
Stata没用过,不过感觉用R处理这个问题应该不难

使用道具

藤椅
ermutuxia 发表于 2014-8-19 15:33:21 |只看作者 |坛友微信交流群
操作确实复杂,可以提供一个思路,首先建立一个名字库吧。

使用道具

板凳
iabc 发表于 2014-8-19 19:33:05 |只看作者 |坛友微信交流群
小女子按照你的要求,随机生成200条observation,其中每篇author数最大为7,然后整理的结果如下 模拟的结果

如果结果符合你的要求,可以私信我啊,很希望能够帮到你
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
huyiustc + 5 + 1 + 1 + 1 热心帮助其他会员

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

使用道具

报纸
iabc 发表于 2014-8-20 11:07:23 来自手机 |只看作者 |坛友微信交流群
title3中的A在title1,2,4中出现,C中title2中出现,Z在title5中出现,所以at_least3=1是这样理解吗

使用道具

地板
hqs811 发表于 2014-8-20 11:32:49 |只看作者 |坛友微信交流群
谢谢大家的回复,由于我描述不清造成大家误解,抱歉。

已更正为:同时出现  也就是说A和C 必须同时在title1和title3出现他们的at_least2才是2.

希望可以明白一点,继续顶上来寻求帮助!

使用道具

7
hqs811 发表于 2014-8-21 08:21:18 来自手机 |只看作者 |坛友微信交流群
顶一下

使用道具

8
iabc 发表于 2014-8-21 18:03:10 |只看作者 |坛友微信交流群
去了30个observations再做了一遍,楼主看看是否正确

捕获.GIF (26.21 KB)

模拟结果

模拟结果

使用道具

9
hqs811 发表于 2014-8-21 20:42:35 |只看作者 |坛友微信交流群
iabc 发表于 2014-8-21 18:03
去了30个observations再做了一遍,楼主看看是否正确
谢谢回复

肉眼识别稍微困难了一点..虽然这是在R里,你愿意分享一下R的program吗?

使用道具

10
iabc 发表于 2014-8-21 20:55:22 |只看作者 |坛友微信交流群
hqs811 发表于 2014-8-21 20:42
谢谢回复

肉眼识别稍微困难了一点..虽然这是在R里,你愿意分享一下R的program吗?
####################################################################
#####         模拟数据
#################################################################
Title=paste0("title",1:30)

names=paste0(rep(letters,9),1:9)
author.names=function(n){       ####随机生成单篇文章作者
      NAMES=sort(sample(names,size=n,replace=FALSE))
      paste(NAMES,"",sep="",collapse=" | ")
}

v.a.n=function(n){             ####向量化生成多篇文章作者
      sapply(n,author.names)
}

Author.num=sapply(1:30,function(o){sample(1:9,size=1)})
Author.names=v.a.n(Author.num)


dat=data.frame(title=Title,author_names=Author.names,author_num=Author.num)
##############################################################################


#######################################################################
#####   Data preparation
#####################################################################
mynames=function(name){unlist(strsplit(name," \\| "))}   ## "|"要用转义字符表示
v.names=function(names){lapply(names,mynames)}

namebook=v.names(Author.names)   

LEN=nrow(dat)

author_at_least.list=lapply(1:LEN,function(o){rep(0,5)})



for(i in 1:LEN){
  name=namebook[]
  ind=(1:LEN)[-i]
  re_names=sapply(ind,function(k){sum(!is.na(match(name,namebook[[k]])))})
  n=min(5,max(re_names))
  if(n!=0) author_at_least.list[][1:n]=1
}


author_at_least.matrix=matrix(unlist(author_at_least.list),byrow=TRUE,ncol=5)
colnames(author_at_least.matrix)=paste0("at_least",1:5)

mdata=cbind(dat,author_at_least.matrix)

mdata
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
hqs811 + 5 + 1 + 1 + 1 谢谢分享!

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

使用道具

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

本版微信群
加好友,备注jltj
拉您入交流群

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

GMT+8, 2024-5-1 01:12