楼主: toby3003
4874 19

[问答] 求助----R软件数据集合并!!!!急 [推广有奖]

11
jmpamao 发表于 2014-3-20 22:33:03
c1<-data1$ID%in%data2$ID
c2 <- data2$ID%in%data1$ID
rbind(data1[c1,],data2[c2,])

你的思路是这个不?这样子的话, 上面两个条件都不需要

12
toby3003 发表于 2014-3-21 10:52:09
jmpamao 发表于 2014-3-20 22:33
c1
我的情况是这样的:我有一组随访数据,不同人的次数是不一样的,有些人有20次,有些人只有2,3次,所以我想在这些随访数据中找出都有12次的人。开始我就用data<-subset(aa,time<=12)找出总的人数,然后我就用您给我的那个语句,data<-data[duplicated(data[,1])+duplicated(data[,1],fromLast=T)>0,]但是现在并没有找出共同项,所以现在我也不知道怎么弄好了,多谢

13
jmpamao 发表于 2014-3-21 17:38:58
还是 不清楚 是 什么样的数据 及 你的需求

14
toby3003 发表于 2014-3-21 20:07:03
jmpamao 发表于 2014-3-21 17:38
还是 不清楚 是 什么样的数据 及 你的需求
数据格式:
healthid随访次数 x
11 a
1 2 b
1 3 c
1 4 d
1 5 e
2 1 f
2 2 g
2 3 h
2 4 i
3 1 g
3 2 k
3 3 l
我想的是提出每个healthid的前三组数据,也就是每个人随访三次的数据。不知道我说的是否明白。。。

15
jmpamao 发表于 2014-3-21 20:56:41
toby3003 发表于 2014-3-21 20:07
数据格式:
我想的是提出每个healthid的前三组数据,也就是每个人随访三次的数据。不知道我说的是否明白 ...
是不是这样的?
  1. #大体上了解你的意思,  我重新给个,
  2. #现在要取 ID次数大于等于4的子集下,再取每个ID 1到4的数据
  3. #ID1 为5次,ID2为4次, ID3为3次,ID4为5次
  4. #ID3要去掉,其余的取前4个数。
  5. #所以的ID  和 time  都有序排列

  6. data <- read.table(text="id time dose
  7.                    1  1         a
  8. 1         2         b
  9. 1         3         c
  10. 1         4         d
  11. 1         5         e
  12. 2         1         f
  13. 2         2         g
  14. 2         3         h
  15. 2         4         i
  16. 3         1         g
  17. 3         2         k
  18. 3         3         l
  19. 4  1   d
  20. 4  2  f
  21. 4 3   g
  22. 4  4  r
  23. 4  5  u
  24. ",header=T)

  25. data<-data[rep(table(data[,1])>=4,table(data[,1])),]#ID3 排除了

  26. data2<-unique(data[,1])
  27. data3<-match(data2,data[,1])#每个ID第一个位置

  28. data4<-rep(data3,each=4)+0:3#每个ID第一个位置:(。。第一个位置+3)
  29. data[data4,]
复制代码
复制代码

16
toby3003 发表于 2014-3-22 01:24:34
jmpamao 发表于 2014-3-21 20:56
是不是这样的?
谢谢您认真的回复,但是我现在的情况是,我有大概2万多糖尿病患者的数据,随访一共量差不多30万次随访,我统计了一下每人随访的数量如下:(第一排是随访次数,第二排是随访该次数的人) 1           2        3        4             5     6            7     8          9         10        11       12    13         14       15     16        17    18     .....
26287 25170 23824 22706 21633 20373 19135 17731 16264 14829 13287 11907 10150  8592  7558  6248  4875  3913 ....

我计划整理出有12次随访的患者的数据,按照您给我的方法,貌似不太可行。。我想请问一下,哪种方法比较高效一些。
我之前用的方法是:
  1. data11<-subset(diabetes,time==11)
  2. data11<-data11[match(data12$healthid,data11$healthid),]
复制代码
然后把随访11次10次。。。。1次这种的数据筛选好,然后把所有数据rbind一下,但是我发现貌似得不到我想要的数据,所以挺郁闷的,请帮我想想,多谢多谢!

17
zhangyangsmith 发表于 2014-3-22 04:14:02
toby3003 发表于 2014-3-22 01:24
谢谢您认真的回复,但是我现在的情况是,我有大概2万多糖尿病患者的数据,随访一共量差不多30万次随访,我 ...
You have actually had a very good idea by counting the number of patients who have been visited for a specific number. Instead you probably should count the number of visits for each patient.

Following @jmpamao 's example:
  1. data <- read.table(text="id time dose
  2.                    1         1         a
  3.                    1         2         b
  4.                    1         3         c
  5.                    1         4         d
  6.                    1         5         e
  7.                    2         1         f
  8.                    2         2         g
  9.                    2         3         h
  10.                    2         4         i
  11.                    3         1         g
  12.                    3         2         k
  13.                    3         3         l
  14.                    4         1         d
  15.                    4         2         f
  16.                    4         3         g
  17.                    4         4         r
  18.                    4         5         u
  19.                    ",header=T)
  20. # Count the number of visits for each patient
  21. # Assuming each row represents one visit
  22. frq <- table(data$id)

  23. # frq is a named vector where its names are ids and elements are counts of visits
  24. slct <-
  25.   data[data$id %in% as.numeric(names(frq[frq == 3])), ]
复制代码
Keep in mind the names of frq is character in type, if the id field in the original dataset is not of type character you will need to convert it explicitly (as done above).

@jmpamao, this is the first time I see someone using read.table in such a "datalines" fashion.

18
jmpamao 发表于 2014-3-22 08:00:34
toby3003 发表于 2014-3-22 01:24
谢谢您认真的回复,但是我现在的情况是,我有大概2万多糖尿病患者的数据,随访一共量差不多30万次随访,我 ...
你的需求是这样吗?把所有有12次随访的 数据集合。 比如 ID1,有1:14次随访,只需要其1:12的数据, ID2 有1:5次的随访,ID5舍弃?再试试看下面的,看看 要多少时间?
  1. data<-data[order(data[,1],data[,2]),]# 先给ID 排序,后再 time 排序
  2. data<-data[rep(table(data[,1])>=12,table(data[,1])),]#ID次数小于12的都 排除了

  3. data2<-unique(data[,1])
  4. data3<-match(data2,data[,1])#每个ID第一个位置

  5. data4<-rep(data3,each=12)+0:11#每个ID第一个位置到其第12的位置
  6. data[data4,]
复制代码


@zhangyangsmith 这种形式是text=“复制,粘贴方便”




19
jmpamao 发表于 2014-3-22 08:23:10
我模拟了下 你的情况, 速度很快的
  1. data <- data.frame(id=rep(1:20000,each=20),time=1:20)
  2. data<-data[sample(nrow(data),300000),]
  3. data<-data[order(data[,1],data[,2]),]# 先给ID 排序,后再 time 排序
  4. data<-data[rep(table(data[,1])>=12,table(data[,1])),]#ID次数小于12 排除了

  5. data2<-unique(data[,1])
  6. data3<-match(data2,data[,1])#每个ID第一个位置

  7. data4<-rep(data3,each=12)+0:11#每个ID第一个位置到12
  8. data[data4,]
复制代码

20
风之栖梧 发表于 2014-4-10 11:29:25
楼主,我看了你首先的问题,可以用reshape包来重铸,
  1. require(reshape)
  2. md1<-melt(data1,id=(c('id','time)))
  3. md2<-melt(data2,id=(c('id','time')))
  4. md<-rbind(md1,md2)
  5. data<-cast(md,id+time~variable)
  6. data
  7.   id time dose
  8. 1  1    1    a
  9. 2  1    2    x
  10. 3  2    1    b
  11. 4  2    2    y
  12. 5  3    1    c
  13. 6  3    2    z
  14. 7  4    1    d
复制代码

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

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