R:按组

时间:2018-01-25 17:19:51

标签: r group-by plyr difference data-management

我在R中有一个大型数据集,其中每个主题(标签:1,2,3,...)在几个时间点被扫描2次或更多次脂肪质量,瘦体重等(评论:PRE F1 BMR,POST F1 BMR,..)。有些扫描是不稳定的,所以我们不能只对它们进行平均。我需要一种方法来自动选择其中一个变量(Fat)的两个最佳(最接近)测量值的行。这是数据集的样子:

Example of dataset with multiple scans for subject 16 in POST F1 BMR

我一直在尝试按标签和注释对数据进行分组,但是有没有办法在Fat测量最接近的那些组中切出两行?

(P.S。仍然是一个苦苦挣扎的R用户,第一次在StackOverflow上发帖,所以请原谅布局!)

编辑:这是一个简单的测试用例,其中包含预期的结果 -

set.seed(2)
df <- data.frame(Fat=sample(1:10, 12, replace=T), 
             Lean=sample(1:5, 12, replace=T), 
             Label=rep(1:2, c(5,7)),
             Comments=rep(c("PRE BMR", "POST BMR", "PRE BMR", "POST 
             BMR"), c(2,3,2,5)))

dfresults<-df[-c(4,8,9,12),]

1 个答案:

答案 0 :(得分:0)

我认为这可能就是你要找的东西:

  1. 首先将您的label
  2. 分组
  3. fat安排排序升序
  4. 制作一个具有差异(diffvals1
  5. 的新列
  6. fat安排排序降序。
  7. 制作一个具有差异(diffvals2
  8. 的新列
  9. 现在按每个新列的min进行过滤,以找到两个最接近的值。
  10. library(tidyverse)
    df %>%
      groupby(label) %>%
      arrange(fat) %>%
      mutate(diffvals1=ave(fat,FUN=abs(function(x) c(NA,diff(x))))) %>% 
      arrange(desc(fat)) %>% 
      mutate(diffvals2=ave(fat,FUN=abs(function(x) c(NA,diff(x))))) %>%
      drop_na() %>% 
      filter(diffvals1==min(diffvals1) | diffvals2==min(diffvals2))
    

    注意:此方法会在几个条件下返回超过2个值:

    • 您有一系列3个或更多值完全相同的值
    • 你有几个完全相同的价值岛。