【问题标题】:Subset Conditions closest higher/lower observation子集条件最接近较高/较低观察值
【发布时间】:2017-09-04 14:47:38
【问题描述】:
AreaCode    Name    Rank
1001108 HA  - 2326
1001247 HA  - 2327
1003063 GC -    2328
1000957 DG -    2329
1001290 EA -    2330
1003305 GC -    2331
1003417 GC -    2332
1006442 WL -    2333
1005076 PK - 2334
1004581 NL -    2335

我是 R 新手,遇到了一些问题。我有一个数据集,我想将最接近的较高/较低排名的区域代码子集到 GC,以便进行病例对照研究。

所以我希望 AreaCode 1001247、1000957、1001290、1006442 在单独的数据框中。我该怎么做呢?我假设通过一个循环,但没有这些经验。这些数据有大约 6000 个观测值,因此手工操作会让人筋疲力尽。有没有办法做到这一点?

【问题讨论】:

  • 你能具体说明你最接近的意思吗?在 Ranks/AreaCode 中最近的 nrs,位置?
  • 嗨,是的 - 我想要排名最接近的,所以对于每个 GC 区号,我想要排名最接近(更高和更低)的非 GC 区号。
  • 请分享您想要的输出。

标签: r loops for-loop subset


【解决方案1】:

另一种选择是这样的(假设 Name 是一个字符变量):

df2 = df %>% 
  mutate(newcol = ifelse(!Name=="GC"&(lag(Name)=="GC"|lead(Name)=="GC"),1,0) ) %>% 
  filter(newcol==1)

【讨论】:

    【解决方案2】:

    cumsumrle 在这里很有用

    brks <- cumsum(rle(df$Name)$lengths) 
    # [1]  2  3  4  5  7  8  9 10
    
    equalsGC <- which(rle(df$Name)$values=="GC")
    # [1] 2 5
    
    ans <- df$AreaCode[sort(brks[c(equalsGC+1, equalsGC-1)])]
    # [1] 1001247 1003063 1001290 1003417
    

    作为一个单独的块

    brks <- cumsum(rle(df$Name)$lengths) 
    equalsGC <- which(rle(df$Name)$values=="GC")
    ans <- df$AreaCode[sort(brks[c(equalsGC+1, equalsGC-1)])]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多