[英]how to subset rows in specific columns based on minimum values in individual columns in a dataframe using R
我們有一個包含 1000 行多列的數據框。 示例數據框如下所示
df1 <- data.frame(X = c(7.48, 7.82, 8.15, 8.47, 8.80, 9.20, 9.51, 9.83, 10.13, 10.59, 7.59, 8.06, 8.39, 8.87, 9.26, 9.64, 10.09, 10.48, 10.88, 11.45),
Y = c(49.16, 48.78, 48.40, 48.03, 47.65, 47.24, 46.87, 46.51, 46.15, 45.73, 48.70, 48.18, 47.72, 47.20, 46.71, 46.23, 45.72, 45.24, 44.77, 44.23),
ID = c("B_1", "B_1", "B_1", "B_1", "B_1", "B_1", "B_1", "B_1", "B_1", "B_1", "B_1_2", "B_1_2", "B_1_2", "B_1_2", "B_1_2", "B_1_2", "B_1_2", "B_1_2", "B_1_2", "B_1_2"),
TI = c(191.31, 191.35, 191.39, 191.44, 191.48, 191.52, 191.56, 191.60, 191.64, 191.69, 1349.93, 1349.97, 1350.01, 1350.05, 1350.09, 1350.14, 1350.18, 1350.22, 1350.26, 1350.30),
X0 = c(0.172, 0.344,0.846,1.335,1.838,2.410,2.89,3.37,3.842,4.46,0.361,0.983,1.545,2.241,2.86,3.47,4.15,4.77,5.388,6.164),
V2 = c(1.154,0.644,0.141,0.348,0.851,1.423,1.9059,2.3875,2.856,3.475,0.771,0.224,0.596,1.262,1.883,2.493,3.168,3.786,4.402,5.177))
在 dataframe 'df1' 中,我們希望分別根據第 5 列和第 6 列中的最小值在 1:4 列中按 ID 對行進行子集化。
例如,在數據框“df1”中,“X0”列中的 ID“B_1”,0.172 是最小值,0.140 是相同 ID 的“V2”列中的最小值。 所以我們想從 1:4 列中提取第 1 行和第 3 行以及它們對應的 df1 數據幀的 X0th 和 V2th 值,如下圖所示。 對於 ID“B_1_2”也是如此。 像變量“X0”、“V2”變量,我們的數據集中有 20 多個變量。
預期的 output 如下圖所示
為了獲得所需的 output 我嘗試了如下所示的代碼
library(data.table)
df1=as.data.table(df1)
a <- do.call(rbind,
apply(df1,1,function(i){
df1[df1[,.I[(X0)==min(X0)],by=ID]$V1]
})
)
上面的代碼有問題。 我正在尋找代碼來獲得所需的 output
我們可以使用map
循環按“ID”分組的“X0”、“V2”列,為該循環列切片值為min
的行,將它們綁定在一起( _dfr
)並創建“d”列這些列的pmin
library(dplyr)
library(purrr)
nm1 <- names(df1)[5:6]
map_dfr(nm1, ~ df1 %>%
group_by(ID) %>%
slice_min(!! rlang::sym(.x))) %>%
ungroup %>%
mutate(d = select(., all_of(nm1)) %>% reduce(pmin))
-輸出
# A tibble: 4 x 7
# X Y ID TI X0 V2 d
# <dbl> <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
#1 8.47 48.0 B_1 191. 0.134 0.348 0.134
#2 7.59 48.7 B_1_2 1350. 0.361 0.771 0.361
#3 8.15 48.4 B_1 191. 0.846 0.141 0.141
#4 8.06 48.2 B_1_2 1350. 0.983 0.224 0.224
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.