R:根据数据框中的条件折叠行并更改值
R: collapse rows and change value according to condition in data frame
我有一个数据集:
structure(list(num = c(12L, 12L), code = structure(1:2, .Label = c("a",
"b"), class = "factor"), ranking = c(2414.5, 2414.5), bottom = c(-0.0153795976572657,
-0.00651997615327495), previous = c(0.00121016455715892,
-0.000166609624290187), of_all_previous = c(-0.000570973882726524,
-0.000771377162183913)), row.names = c(NA, -2L), class = "data.frame")
我想根据 num
和 ranking
折叠两行,因为它们相同,但根据两行的列值 code
的条件更改 code
=15=]、previous
和 of_all_previous
应该按顺序进行比较(意思是:如果它们相等,则转到下一列,如 bottom
-> previous
- > of_all_previous
) 并选择具有较高值的 code
。
在提供的示例数据的情况下,code
b
因为 -0.0065199761532749503 > -0.0153795976572656777
在 bottom
列中。
如果它们相等,则必须查看 previous
列。
我认为也许 dplyr
可以使用 %>%
折叠行,但我找不到如何根据条件同时更改行。
我希望输出看起来像这样:
num code ranking
1 12 a 2414
提前致谢。
也许,我们可以转向 'long' 格式和 slice
行
library(dplyr)
library(tidyr)
df1 %>%
pivot_longer(cols = bottom:of_all_previous) %>%
group_by(num, ranking, name) %>%
slice(which.max(value)) %>%
ungroup %>%
slice(1)
# A tibble: 1 x 5
# num code ranking name value
# <int> <fct> <dbl> <chr> <dbl>
#1 12 b 2414. bottom -0.00652
一种方法可能是 group_by
num
和 ranking
以查看具有相同值且需要折叠的行。
然后,将arrange
(排序)进行比较的列降序排列,包括bottom
previous
和of_all_previous
。完成此操作后,排序数据中较高的行将考虑列,以便在有联系时进行比较。
最后,您可以根据排序创建一个final_code
和first(code)
。
library(tidyverse)
df %>%
group_by(num, ranking) %>%
arrange(-bottom, -previous, -of_all_previous) %>%
mutate(final_code = ifelse(n() > 1, as.character(first(code)), as.character(code))) %>%
slice(1) %>%
select(num, code, ranking)
我有一个数据集:
structure(list(num = c(12L, 12L), code = structure(1:2, .Label = c("a",
"b"), class = "factor"), ranking = c(2414.5, 2414.5), bottom = c(-0.0153795976572657,
-0.00651997615327495), previous = c(0.00121016455715892,
-0.000166609624290187), of_all_previous = c(-0.000570973882726524,
-0.000771377162183913)), row.names = c(NA, -2L), class = "data.frame")
我想根据 num
和 ranking
折叠两行,因为它们相同,但根据两行的列值 code
的条件更改 code
=15=]、previous
和 of_all_previous
应该按顺序进行比较(意思是:如果它们相等,则转到下一列,如 bottom
-> previous
- > of_all_previous
) 并选择具有较高值的 code
。
在提供的示例数据的情况下,code
b
因为 -0.0065199761532749503 > -0.0153795976572656777
在 bottom
列中。
如果它们相等,则必须查看 previous
列。
我认为也许 dplyr
可以使用 %>%
折叠行,但我找不到如何根据条件同时更改行。
我希望输出看起来像这样:
num code ranking
1 12 a 2414
提前致谢。
也许,我们可以转向 'long' 格式和 slice
行
library(dplyr)
library(tidyr)
df1 %>%
pivot_longer(cols = bottom:of_all_previous) %>%
group_by(num, ranking, name) %>%
slice(which.max(value)) %>%
ungroup %>%
slice(1)
# A tibble: 1 x 5
# num code ranking name value
# <int> <fct> <dbl> <chr> <dbl>
#1 12 b 2414. bottom -0.00652
一种方法可能是 group_by
num
和 ranking
以查看具有相同值且需要折叠的行。
然后,将arrange
(排序)进行比较的列降序排列,包括bottom
previous
和of_all_previous
。完成此操作后,排序数据中较高的行将考虑列,以便在有联系时进行比较。
最后,您可以根据排序创建一个final_code
和first(code)
。
library(tidyverse)
df %>%
group_by(num, ranking) %>%
arrange(-bottom, -previous, -of_all_previous) %>%
mutate(final_code = ifelse(n() > 1, as.character(first(code)), as.character(code))) %>%
slice(1) %>%
select(num, code, ranking)