草庐IT

关于 r:查找患者 ID 至少出现两次以上

codeneng 2023-03-28 原文

Find patient ID at least appears two time and more

本问题已经有最佳答案,请猛点这里访问。
1
df<-data.frame(PATIENT_ID=c(1,1,2,3,3,3,4,5,5,5,5,5))

我要查找已记录至少 2 次的患者 ID。

输出应该是:

1
df_output<-data.frame(PATIENT_ID=c(1,3,5))

谢谢。


又一个dplyr解决方案

1
2
3
df %>%
  group_by(PATIENT_ID) %>%
  filter(n() > 1 & row_number() == 1)

data.table。 (我更喜欢在这里使用 .SD-logic,但是 data.table#3262 仍然是打开的,并且您的示例数据没有其他列。它不会快多少,但如果数据明显更大。)

1
2
3
4
5
6
7
library(data.table)
DT <- as.data.table(df)
DT[, .(n=.N),by=PATIENT_ID][n>1,][,n:=NULL][]
#    PATIENT_ID
# 1:          1
# 2:          3
# 3:          5

如果您的数据比样本大,这些基准会改变,但可能会以相同的比例发生变化:user31264\\ 的答案几乎肯定是最快的,而更复杂的 dplyr 管道可能会保留它们的相对表现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
microbenchmark::microbenchmark(
  user = {
    a = rle(df$PATIENT_ID)
    data.frame(PATIENT_ID=a$values[a$lengths>1])
  },
  user_sort = {
    a = rle(sort(df$PATIENT_ID))
    data.frame(PATIENT_ID=a$values[a$lengths>1])
  },
  r2a = df %>%
    group_by(PATIENT_ID) %>%
    filter(n() > 1 & row_number() == 1) %>%
    ungroup(),
  r2b = DT[, .(n=.N),by=PATIENT_ID][n>1,][,n:=NULL],
  csg = df %>%
    group_by(PATIENT_ID) %>%
    summarize(n = n()) %>%
    filter(n >= 2) %>%
    select(PATIENT_ID),
  duck = df %>%
  group_by(PATIENT_ID) %>%
    mutate(N=n()) %>%
    filter(N>=2) %>%
    select(-N) %>%
    filter(!duplicated(PATIENT_ID))
)
# Unit: microseconds
#       expr    min      lq     mean  median      uq     max neval
#       user  116.2  138.55  168.536  167.30  180.30   366.2   100
#  user_sort  160.1  184.55  238.249  224.60  255.60   464.3   100
#        r2a 3018.4 3399.60 4020.076 3839.70 4202.95 12193.5   100
#        r2b 2094.6 2945.30 3367.188 3277.80 3838.35  5183.8   100
#        csg 5382.5 6262.20 6708.582 6670.90 6992.80  9078.2   100
#       duck 7538.3 8568.55 9275.720 8928.65 9420.20 16678.5   100

另一个 dplyr 解决方案,使用 summarize 而不是 mutate 然后 filter 的组合。首先,我们按变量分组,我们计算每组有多少个观察值,然后仅在有两个或多个观察值时才保留。最后一步只保留感兴趣的变量(删除新的 n 列)

1
2
3
4
5
6
library(dplyr)
df %>%
    group_by(PATIENT_ID) %>%
    summarize(n = n()) %>%
    filter(n >= 2) %>%
    select(PATIENT_ID)

1
2
a = rle(df$PATIENT_ID)
df_output=data.frame(PATIENT_ID=a$val[a$len>1])

如果df未排序,第一行应该是a = rle(sort(df$PATIEND_ID))

  • 虽然这给出了所需的输出,但有两件事(也许可以解释否决?):(1)属性名称的部分匹配可能会对某些用户产生警告(次要); (2) PATIEND 中的错字。我认为这是最简单的(也是base-R)。


试试这个:

1
2
3
4
5
6
7
8
9
10
11
12
library(dplyr)

df %>% group_by(PATIENT_ID) %>% mutate(N=n()) %>%
  filter(N>=2) %>% select(-N) %>% filter(!duplicated(PATIENT_ID))

# A tibble: 3 x 1
# Groups:   PATIENT_ID [3]
  PATIENT_ID
       <dbl>
1          1
2          3
3          5

  • 如果您使用 tally() 而不是 mutate,则不必使用 filter(!dup...,因为它会自动减少。您可以使用 df %>% group_by(PATIENT_ID) %>% filter(n() > 1 & row_number() == 1) 进一步简化它。
  • @r2evans 是的,这是一种非常理想的方式!

有关关于 r:查找患者 ID 至少出现两次以上的更多相关文章

  1. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  2. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  3. ruby-on-rails - Rake 任务仅调用一次时执行两次 - 2

    我写了一个非常简单的rake任务来尝试找到这个问题的根源。namespace:foodotaskbar::environmentdoputs'RUNNING'endend当在控制台中执行rakefoo:bar时,输出为:RUNNINGRUNNING当我执行任何rake任务时会发生这种情况。有没有人遇到过这样的事情?编辑上面的rake任务就是写在那个.rake文件中的所有内容。这是当前正在使用的Rakefile。requireFile.expand_path('../config/application',__FILE__)OurApp::Application.load_tasks这里

  4. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

  5. ruby-on-rails - 在 Rails 中更高效地查找或创建多条记录 - 2

    我有一个应用需要发送用户事件邀请。当用户邀请friend(用户)参加事件时,如果尚不存在将用户连接到该事件的新记录,则会创建该记录。我的模型由用户、事件和events_user组成。classEventdefinvite(user_id,*args)user_id.eachdo|u|e=EventsUser.find_or_create_by_event_id_and_user_id(self.id,u)e.save!endendend用法Event.first.invite([1,2,3])我不认为以上是完成我的任务的最有效方法。我设想了一种方法,例如Model.find_or_cr

  6. ruby - Rails -- :id attribute? 所需的数据库索引 - 2

    因此,当我遵循MichaelHartl的RubyonRails教程时,我注意到在用户表中,我们为:email属性添加了一个唯一索引,以提高find的效率方法,因此它不会逐行搜索。到目前为止,我们一直在根据情况使用find_by_email和find_by_id进行搜索。然而,我们从未为:id属性设置索引。:id是否自动索引,因为它在默认情况下是唯一的并且本质上是顺序的?或者情况并非如此,我应该为:id搜索添加索引吗? 最佳答案 大多数数据库(包括sqlite,这是RoR中的默认数据库)会自动索引主键,对于RailsMigration

  7. ruby - 查找重叠的正则表达式匹配项 - 2

    我想找到给定字符串中的所有匹配项,包括重叠匹配项。我怎样才能实现它?#Example"a-b-c-d".???(/\w-\w/)#=>["a-b","b-c","c-d"]expected#Solutionwithoutoverlappedresults"a-b-c-d".scan(/\w-\w/)#=>["a-b","c-d"],but"b-c"ismissing 最佳答案 在积极的前瞻中使用捕获:"a-b-c-d".scan(/(?=(\w-\w))/).flatten#=>["a-b","b-c","c-d"]参见Rubyde

  8. ruby-on-rails - 关于 Ruby 的一般问题 - 2

    我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia

  9. ruby - 在 Ruby 中查找多个正则表达式匹配的模式和位置 - 2

    这应该是一个简单的问题,但我找不到任何相关信息。给定一个Ruby中的正则表达式,对于每个匹配项,我需要检索匹配的模式$1、$2,但我还需要匹配位置。我知道=~运算符为我提供了第一个匹配项的位置,而string.scan(/regex/)为我提供了所有匹配模式。如果可能,我需要在同一步骤中获得两个结果。 最佳答案 MatchDatastring.scan(regex)do$1#Patternatfirstposition$2#Patternatsecondposition$~.offset(1)#Startingandendingpo

  10. ruby - 为什么 return 关键字会导致我的 'if block' 出现问题? - 2

    下面的代码工作正常:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson)do|key,oldv,newv|ifkey==:aoldvelsifkey==:bnewvelsekeyendendputskerson.inspect但是如果我在“ifblock”中添加return,我会得到一个错误:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson

随机推荐