【发布时间】:2021-07-06 07:34:06
【问题描述】:
我正在尝试将左侧的数据框转换为右侧的数据框(如下图所示),
在其他列上使用条件:
- Block1(顶部蓝色块):如果 Col4 在组内具有最低但不重复的值,则必须选择该行(下图示例中的第 5 行)
- Block2(从上数第二个浅绿色块):如果 Col4 具有相同的重复值,则 Col5 的最小值起作用。但是,第 9 行和第 10 行有联系。要打破平局:按排名,必须选择较高的行或最后一行(第 10 行而不是第 9 行,因为 10 大于 9)。
- 在从顶部算起的第三个块(红色)中,Col4 有两个 1(Col4 中的最低值),对应的 Col5 有两个 2。由于第 11 行和第 13 行现在有关系,因此必须按等级选择较高的行或最后一行(第 13 行而不是 11 行,因为 13 大于 11)。
上述逻辑对其他块继续。
使用切片的 tidyverse dplyr 方法,
DF <- Data_Frame %>% dplyr::group_by(Col1, Col2, Col3) %>% dplyr::slice(which.min(Col4))
产生以下结果:
我在上面的代码中做错了什么?
上面使用的数据框是:
Data_Frame <- data.frame(Col1 = c("A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A2", "A2", "A2", "A2", "A2", "A2", "A3", "A3", "A3", "A3", "A3", "A3", "A3"),
Col2 = c("a", "a", "a", "a", "b", "b", "b", "b", "b", "c", "c", "c", "c", "d", "d", "d", "e", "e", "e", "f", "f", "f", "g", "g", "g", "h", "h", "h", "h"),
Col3 = c("Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Aa1", "Bb1","Bb1", "Bb1", "Bb1", "Bb1", "Bb1", "Cc1", "Cc1", "Cc1", "Cc1", "Cc1", "Cc1", "Cc1"),
Col4 = c(4, 2, 2, 1, 4, 4, 4, 4, 4, 1, 3, 1, 2, 3, 3, 3, 1, 3, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1),
Col5 = c(7, 6, 3, 1, 3, 2, 5, 1, 1, 2, 3, 2, 4, 1, 3, 1, 2, 4, 3, 1, 2, 1, 1, 2, 1, 4, 4, 2, 2))
【问题讨论】:
标签: r dataframe dplyr conditional-statements aggregate