gpt4 book ai didi

r - 在 R 的数据框中有条件地分组值

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:59:01 24 4
gpt4 key购买 nike

同事

我有以下问题。我的数据集如下所示:

Article = c("A","A","A","A","B","B","B","C","C","C","C")
Value = c(1,5,2,1,20,18,5,6,3,31,99)
df = data.frame(Article, Value)

我的目标是将每篇文章的最高值(value)与每篇文章的最低值(value)相匹配(忽略中间值),例如1 对 100、2 对 99、3 对 98 等等。并为这些匹配分配组。

此数据框的最终结果必须将文章“A”的第一行与文章“A”的第二行相匹配,因为第一行的值为 1(并且是最低的),第二行的值为 5(而且是最高的)。对于这一对,算法必须分配一个相似的组,例如“A_1”。然后算法查看文章“A”的剩余行并重复分配过程 - 我们只剩下两行,因此它将它们匹配到“A_2”。

之后,算法会跳转到 Article = "B"的行,依此类推。

最终结果必须如下所示:

Group = c("A_1","A_1", "A_2","A_2", "B_1", "B_NA", "B_1", "C_2", "C_1", "C_2", "C_1")
df = data.frame(Article, Value, Group)

我的想法(我还不知道如何编码)有点奇怪:

对于文章中的 N,我想对数据框段进行升序排序(例如,仅过滤文章 N 的数据框并对该段进行升序排序)并分配给第一行的组值 =“N_1”。然后分配段值的最后一行=“N_1”。接下来过滤该段以查找在 Group 变量中尚未分配值的行,并对第一个和最后一个值重复分配。依此类推,直到算法为段中的所有行给出分组,然后它跳转到 N 中的另一个值。

有人可以就这个问题给我建议吗?提前致谢

最佳答案

如果每个组的 value 列没有任何重复项,则此方法有效。

f_lbl <- function(x, i){
l <- length(x)
mid <- floor(l/2)
lbl <- names(ls)[i]
a <- paste0(lbl, "_" , rep(NA, l))
a[1:mid] <- paste0(lbl,"_",1:mid)
a[l:(l-mid+1)] <- paste0(lbl,"_",1:mid)
return(a[match(x, sort(x))])
}

ls <- with(df, split(Value, Article))
df$Group <- unlist(sapply(seq_along(ls), function(i) f_lbl(ls[[i]],i)))

# Article Value Group
# 1 A 3 A_2
# 2 A 5 A_1
# 3 A 2 A_2
# 4 A 1 A_1
# 5 B 20 B_1
# 6 B 18 B_NA
# 7 B 5 B_1
# 8 C 6 C_2
# 9 C 3 C_1
# 10 C 31 C_2
# 11 C 99 C_1

关于r - 在 R 的数据框中有条件地分组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40134350/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com