如何检测具有至少一个错位数字的个体

huangapple go评论100阅读模式
英文:

How to detect individuals who have at least one misordered number

问题

这是我的数据集表示:

  1. ID<-c(1,1,1,1,
  2. 2,2,2,
  3. 3,3,
  4. 4,4,4,4)
  5. order<-c(44,44,45,41,
  6. 13,21,2013,
  7. 21,10,
  8. 45,65,74,877)
  9. mydata<-data.frame(
  10. ID=ID, order=order
  11. )

变量order应该随着时间增加。通过程序,我应该检测所有在随访时变量order减少的个体(在本例中为ID=1和ID=3)。

英文:

Here is a representation of my dataset:

  1. ID&lt;-c(1,1,1,1,
  2. 2,2,2,
  3. 3,3,
  4. 4,4,4,4)
  5. order&lt;-c(44,44,45,41,
  6. 13,21,2013,
  7. 21,10,
  8. 45,65,74,877)
  9. mydata&lt;-data.frame(
  10. ID=ID,order=order
  11. )
  12. ID Time order
  13. 1 1 1 44
  14. 2 1 2 44
  15. 3 1 3 45
  16. 4 1 4 41
  17. 5 2 1 13
  18. 6 2 2 21
  19. 7 2 3 2013
  20. 8 3 1 21
  21. 9 3 2 10
  22. 10 4 1 45
  23. 11 4 2 65
  24. 12 4 3 74
  25. 13 4 4 877

The variable order should increase with time.
With a program, I should detect all the individuals (ID=1 and ID=3 in this case) that have variable order that decreases at a time of follow-up.

答案1

得分: 2

  1. unique(subset(mydata, ave(order, ID, FUN=function(x) c(0, diff(x))) < 0)$ID)
  2. [1] 1 3
  3. or if you want the rows back:
  4. subset(mydata, ave(order, ID, FUN=function(x) c(0, diff(x))) < 0)
  5. ID order
  6. 4 1 41
  7. 9 3 10
  8. library(dplyr) # version >= 1.1.0
  9. mydata %>%
  10. filter(order < lag(order), .by=ID)
  11. ID order
  12. 1 1 41
  13. 2 3 10
英文:
  1. unique(subset(mydata, ave(order, ID, FUN=\(x)c(0, diff(x)))&lt;0)$ID)
  2. [1] 1 3

or if you want the rows back:

  1. subset(mydata, ave(order, ID, FUN=\(x)c(0, diff(x)))&lt;0)
  2. ID order
  3. 4 1 41
  4. 9 3 10
  5. library(dplyr) # version &gt;= 1.1.0
  6. mydata %&gt;%
  7. filter(order&lt;lag(order), .by=ID)
  8. ID order
  9. 1 1 41
  10. 2 3 10

答案2

得分: 2

  1. 根据Roland的评论,请检查`is.unsorted`函数:
  2. ```r
  3. unique(mydata$ID[with(mydata, ave(order, ID, FUN = is.unsorted)) == 1])
  4. #[1] 1 3

或者

  1. subset(mydata, ave(order, ID, FUN = is.unsorted) == 1)
  2. # ID order
  3. #1 1 44
  4. #2 1 44
  5. #3 1 45
  6. #4 1 41
  7. #8 3 21
  8. #9 3 10

dplyr中:

  1. library(dplyr) #1.1.0
  2. filter(mydata, is.unsorted(order), .by = ID)

data.table中:

  1. setDT(mydata)[, .SD[is.unsorted(order)], by = ID]
英文:

As per Roland's comment, check is.unsorted:

  1. unique(mydata$ID[with(mydata, ave(order, ID, FUN = is.unsorted)) == 1])
  2. #[1] 1 3

or

  1. subset(mydata, ave(order, ID, FUN = is.unsorted) == 1)
  2. # ID order
  3. #1 1 44
  4. #2 1 44
  5. #3 1 45
  6. #4 1 41
  7. #8 3 21
  8. #9 3 10

In dplyr:

  1. library(dplyr) #1.1.0
  2. filter(mydata, is.unsorted(order), .by = ID)

In data.table:

  1. setDT(mydata)[, .SD[is.unsorted(order)], by = ID]

答案3

得分: 1

我们可以检查rank(order)是否对应于row_number()

  1. library(dplyr)
  2. mydata %>%
  3. filter(row_number() != rank(order, ties.method = "first"), .by = ID)
  4. #> # A tibble: 6 × 2
  5. #> # Groups: ID [2]
  6. #> ID order
  7. #> <dbl> <dbl>
  8. #> 1 1 44
  9. #> 2 1 44
  10. #> 3 1 45
  11. #> 4 1 41
  12. #> 5 3 21
  13. #> 6 3 10

要仅获取个体的ID,我们可以在管道中添加 pull(ID) %>% unique()

  1. mydata %>%
  2. filter(row_number() != rank(order, ties.method = "first"), .by = ID) %>%
  3. pull(ID) %>%
  4. unique()
  5. #> 1 3

数据来自 OP

  1. ID<-c(1,1,1,1,
  2. 2,2,2,
  3. 3,3,
  4. 4,4,4,4)
  5. order<-c(44,44,45,41,
  6. 13,21,2013,
  7. 21,10,
  8. 45,65,74,877)
  9. mydata<-data.frame(
  10. ID=ID,order=order
  11. )

创建于 2023-03-09,使用 reprex v2.0.2

英文:

We could check if the rank(order) corresponds to the row_number():

  1. library(dplyr)
  2. mydata %&gt;%
  3. filter(row_number() != rank(order, ties.method = &quot;first&quot;), .by = ID)
  4. #&gt; # A tibble: 6 &#215; 2
  5. #&gt; # Groups: ID [2]
  6. #&gt; ID order
  7. #&gt; &lt;dbl&gt; &lt;dbl&gt;
  8. #&gt; 1 1 44
  9. #&gt; 2 1 44
  10. #&gt; 3 1 45
  11. #&gt; 4 1 41
  12. #&gt; 5 3 21
  13. #&gt; 6 3 10

To just get the ID of the individuals we can add pull(ID) %&gt;% unique() to the pipe:

  1. mydata %&gt;%
  2. filter(row_number() != rank(order, ties.method = &quot;first&quot;), .by = ID) %&gt;%
  3. pull(ID) %&gt;%
  4. unique()
  5. #&gt; 1 3

Data from OP

  1. ID&lt;-c(1,1,1,1,
  2. 2,2,2,
  3. 3,3,
  4. 4,4,4,4)
  5. order&lt;-c(44,44,45,41,
  6. 13,21,2013,
  7. 21,10,
  8. 45,65,74,877)
  9. mydata&lt;-data.frame(
  10. ID=ID,order=order
  11. )

<sup>Created on 2023-03-09 with reprex v2.0.2</sup>

huangapple
  • 本文由 发表于 2023年3月9日 19:42:20
  • 转载请务必保留本文链接:https://go.coder-hub.com/75684122.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定