r - R - 在包含字符串、NA 和组的数据框中提取最大/最小值行
问题描述
我想找到一种方法来提取数据框中包含 Top 结果(最小值和最大值)的 n 行。问题是这个数据框包含字符串和 NA 以及组。此外,如果顶部结果在同一行中,我仍然需要正好 n 行,因此在同一行中的计数与 1 个结果相同。
V01_Code V01_Corr V01_Lag V02_Code V02_Corr V02_Lag V03_Code V03_Corr V03_Lag V04_Code V04_Corr V04_Lag Group
1 AMI 0.63 L7 <NA> NA <NA> <NA> NA <NA> <NA> NA <NA> B
2 CII -0.61 L7 CMI -0.53 L7 <NA> NA <NA> <NA> NA <NA> A
3 AFI 0.51 L7 <NA> NA <NA> <NA> NA <NA> <NA> NA <NA> A
4 AII 0.52 L7 BII 0.62 L4 BMI 0.60 L7 III 0.58 L4 B
5 BII 0.52 L7 IIA 0.74 L6 III 0.51 L7 IMA 0.75 L6 A
6 AII 0.58 L6/L7 BII 0.69 L4 BMI 0.70 L7 IIA 0.57 L4 A
7 IIA 0.58 L6 IMA 0.59 L6 IMI 0.52 L6 <NA> NA <NA> B
8 IMU 0.52 L6 <NA> NA <NA> <NA> NA <NA> <NA> NA <NA> A
我尝试了几个这样的版本:
aggregate(. ~ Group, df, function(x) max(head(sort(x),2),na.rm=T))
但它似乎不起作用!作为输出,我想要一个包含最高和最低值的行(例如这里的 2 行)的数据框。所以在这种情况下,第 5 行中的 0.75 是最高值,第二高在同一行中,然后不计算在内。任何其他行中的第二高将是第 6 行中的 0.7。因此,对于我想要的最大值的前 2 个结果:
V01_Code V01_Corr V01_Lag V02_Code V02_Corr V02_Lag V03_Code V03_Corr V03_Lag V04_Code V04_Corr V04_Lag Group
5 BII 0.52 L7 IIA 0.74 L6 III 0.51 L7 IMA 0.75 L6 A
6 AII 0.58 L6/L7 BII 0.69 L4 BMI 0.70 L7 IIA 0.57 L4 A
1 AMI 0.63 L7 <NA> NA <NA> <NA> NA <NA> <NA> NA <NA> B
4 AII 0.52 L7 BII 0.62 L4 BMI 0.60 L7 III 0.58 L4 B
在这种情况下,n 为 2,因此 2 行包含每个组的最大值。
这是我的数据框
structure(list(V01_Code = c("AMI", "CII", "AFI", "AII", "BII",
"AII", "IIA", "IMU"), V01_Corr = c(0.63, -0.61, 0.51, 0.52, 0.52,
0.58, 0.58, 0.52), V01_Lag = c("L7", "L7", "L7", "L7", "L7",
"L6/L7", "L6", "L6"), V02_Code = c(NA, "CMI", NA, "BII", "IIA",
"BII", "IMA", NA), V02_Corr = c(NA, -0.53, NA, 0.62, 0.74, 0.69,
0.59, NA), V02_Lag = c(NA, "L7", NA, "L4", "L6", "L4", "L6",
NA), V03_Code = c(NA, NA, NA, "BMI", "III", "BMI", "IMI", NA),
V03_Corr = c(NA, NA, NA, 0.6, 0.51, 0.7, 0.52, NA), V03_Lag = c(NA,
NA, NA, "L7", "L7", "L7", "L6", NA), V04_Code = c(NA, NA,
NA, "III", "IMA", "IIA", NA, NA), V04_Corr = c(NA, NA, NA,
0.58, 0.75, 0.57, NA, NA), V04_Lag = c(NA, NA, NA, "L4",
"L6", "L4", NA, NA), Group = c("B", "A", "A", "B", "A", "A",
"B", "A")), row.names = c("1", "2", "3", "4", "5", "6",
"7", "8"), class = "data.frame")
解决方案
这是一个带有重塑的选项,即创建一个行序列(row_number
)列,用 重塑从宽到长pivot_longer
,按“组”和“值”列按desc
结束顺序排列行,然后filter
是第一个“n” unique
“rn”-row_number列,ungroup
并重新整形为“宽”格式pivot_wider
library(dplyr)
library(tidyr)
df1 %>%
mutate(rn = row_number()) %>%
pivot_longer(cols = ends_with("Corr"), names_to = 'Corr') %>%
arrange(Group, desc(value)) %>%
group_by(Group) %>%
filter(rn %in% head(unique(rn), 2)) %>%
ungroup %>%
select(-rn) %>%
pivot_wider(names_from = Corr, values_from = value)
-输出
# A tibble: 4 x 13
V01_Code V01_Lag V02_Code V02_Lag V03_Code V03_Lag V04_Code V04_Lag Group V04_Corr V02_Corr V03_Corr V01_Corr
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 BII L7 IIA L6 III L7 IMA L6 A 0.75 0.74 0.51 0.52
2 AII L6/L7 BII L4 BMI L7 IIA L4 A 0.57 0.69 0.7 0.58
3 AMI L7 <NA> <NA> <NA> <NA> <NA> <NA> B NA NA NA 0.63
4 AII L7 BII L4 BMI L7 III L4 B 0.58 0.62 0.6 0.52
推荐阅读
- java - 如何仅打印字符串的某些部分?
- r - 使用 Rcpp 重写 R 的 cummin() 函数并允许 NA
- monitoring - Prometheus 增加不处理进程重启
- angular - 在标签或跨度中使用 formControlName?
- batch-file - Program Files 86 Java 调用的批处理文件问题
- laravel - 模型关系未更新
- python - 我如何以及为什么不能在 django 上覆盖相关的管理器方法?
- java - 尝试返回 JSON 时,Jax-RS 错误 500 无异常
- javascript - 复制一个对象中的所有元素,除了那些与另一个对象中的元素共享密钥的元素
- c# - 从零开始自动递增 PK - EF Core 代码优先