楼主: lanhong1993
3273 7

[问答] 求助!!这样的数据,怎么删除我不需要的行? [推广有奖]

  • 1关注
  • 1粉丝

已卖:286份资源

博士生

54%

还不是VIP/贵宾

-

威望
0
论坛币
2701 个
通用积分
3.4261
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
12167 点
帖子
214
精华
0
在线时间
141 小时
注册时间
2016-11-1
最后登录
2024-3-26

楼主
lanhong1993 发表于 2017-1-16 16:02:07 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
比如我有这也一个数据集:
id          time                              PaO2         
1     2016/02/03 14:23:00           78            
1     2016/02/03 15:24:00           89
1     2016/02/03 18:44:00           90
1     2016/02/04 08:23:00           77
1     2016/02/04 12:33:00           150
1     2016/02/05 09:12:00           108
1     2016/02/06 14:25:00           103
2     2016/03/12 13:26:00           100         
2     2016/03/12 15:35:00           99
2     2016/03/13 17:46:00           98
3     2016/03/03 16:23:00           109         
3     2016/03/03 19:55:00           95
3     2016/03/04 20:25:00           93
3     2016/03/04 14:23:00           87
3     2016/03/04 17:20:00           113
4     2016/02/08 14:23:00           106           
4     2016/02/08 15:24:00           80

...           ...                   ...           

其中,id为病人编号,time为记录时间,PaO2为病人血氧分压,每个id中的第一个PaO2值是病人入院的基础值,我想要筛选出这样的数据集:每个病人id按照时间顺序,一旦出现某个PaO2值是基础值(即第一个值)的2倍,则保留该数据之前的所有行,删除之后的所有行。这用R该怎么实现呢?
二维码

扫码加我 拉你入群

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

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

关键词:time 数据集 Tim IME 筛选出

沙发
fatherberry 发表于 2017-1-16 16:16:50
R我是不太清楚了,不过如果是stata,首先生成一个变量等于每一个id的第一次测量PaO2的2倍,然后比较大小,最后删除即可。

藤椅
qoiqpwqr 发表于 2017-1-16 21:37:06
一旦出现某个PaO2值是基础值(即第一个值)的2倍

是严格的两倍,还是大于等于两倍?比如第一个值是50,你是要找100这个数,还是只要大于等于100就算满足条件了。

板凳
cheetahfly 在职认证  发表于 2017-1-16 22:36:21
head(my_data, which(my_data$PaO2 >= my_data$PaO2[1] * 2)[1])

报纸
lanhong1993 发表于 2017-1-16 23:28:57
qoiqpwqr 发表于 2017-1-16 21:37
一旦出现某个PaO2值是基础值(即第一个值)的2倍

是严格的两倍,还是大于等于两倍?比如第一个值是50,你 ...
是大于等于(>=)。不好意思,是我表达不对。

地板
lanhong1993 发表于 2017-1-16 23:37:55
cheetahfly 发表于 2017-1-16 22:36
head(my_data, which(my_data$PaO2 >= my_data$PaO2[1] * 2)[1])
这个是只能提出整个数据集的前面部分吧。我想要的是每个id的病人的前面部分

7
cheetahfly 在职认证  发表于 2017-1-16 23:54:24
library(dplyr)
my_data %>%
    group_by(id) %>%
    mutate(judge = PaO2 > PaO2[1] * 2,
           # 第一行大于等于标准值两倍的行未保留
           cumjudge = cumsum(judge)) %>%
           # 如果要保留大于等于两倍标准值的第一行,则改为
           # cumjudge = lag(cumsum(judge), default = 0)) %>%
    filter(cumjudge == 0) %>%
    select(1:3)

8
ntsean 发表于 2017-1-17 03:43:38
  1. f <- function(x) {
  2.   id <- which(x >= 2 * x[1])[1]
  3.   if (is.na(id)) id <- Inf
  4.   id
  5. }

  6. data %>%
  7. group_by(id) %>%
  8. filter(row_number() <= f(PaO2))
复制代码

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-3 22:33