R:Select 行,按组有两个最接近的测量值
R: Select rows with two closest measurements by groups
我在 R 中有一个大型数据集,其中每个主题(标签:1、2、3,...)在几个时间点被扫描 2 次或更多次以获取脂肪量、瘦肉量等(评论: PRE F1 BMR,POST F1 BMR,..)。有些扫描是不稳定的,所以我们不能对所有扫描进行平均。我需要一种方法来自动 select 具有变量之一(脂肪)的两个最佳(最接近)测量值的行。数据集如下所示:
Example of dataset with multiple scans for subject 16 in POST F1 BMR
我一直在尝试按标签和评论对数据进行分组,但是有没有办法在脂肪测量值最接近的那些组中切出两行?
(P.S。仍然是一个苦苦挣扎的 R 用户,第一次在 Whosebug 上发帖,所以请原谅布局!)
已编辑:这是一个具有预期结果的简单测试用例 --
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),]
我认为这可能是您要查找的内容:
- 首先将您的
label
s 分组
- 按
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 个以上的值:
- 您有一系列 3 个或更多值完全相同的值
- 您有几个完全相同的值孤岛。
我在 R 中有一个大型数据集,其中每个主题(标签:1、2、3,...)在几个时间点被扫描 2 次或更多次以获取脂肪量、瘦肉量等(评论: PRE F1 BMR,POST F1 BMR,..)。有些扫描是不稳定的,所以我们不能对所有扫描进行平均。我需要一种方法来自动 select 具有变量之一(脂肪)的两个最佳(最接近)测量值的行。数据集如下所示:
Example of dataset with multiple scans for subject 16 in POST F1 BMR
我一直在尝试按标签和评论对数据进行分组,但是有没有办法在脂肪测量值最接近的那些组中切出两行?
(P.S。仍然是一个苦苦挣扎的 R 用户,第一次在 Whosebug 上发帖,所以请原谅布局!)
已编辑:这是一个具有预期结果的简单测试用例 --
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),]
我认为这可能是您要查找的内容:
- 首先将您的
label
s 分组
- 按
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 个以上的值:
- 您有一系列 3 个或更多值完全相同的值
- 您有几个完全相同的值孤岛。