我在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),]
答案 0 :(得分:0)
我认为这可能就是你要找的东西:
label
fat
安排排序升序diffvals1
)fat
安排排序降序。diffvals2
)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个值: