gpt4 book ai didi

R - 根据数据框中的条件按组设置值

转载 作者:行者123 更新时间:2023-12-05 01:55:58 26 4
gpt4 key购买 nike

我有以下数据集。

<表类="s-表"><头>组值行名重叠<正文>组_a412组_a523, 5组_a4834, 5组_a5445组_a125组_b1267组_b17

重叠列表示哪些行具有特定的“重叠”。

我希望仅针对值大于 10 的行,将值列中的数据替换为相应“重叠”列中指示的所有行的零。

预期输出:

<表类="s-表"><头>组值行名重叠<正文>组_a412组_a523, 5组_a4834, 5组_a045组_a05组_b1267组_b07

可重现的例子:

data <- data.frame(group = c("group_a", "group_a", "group_a", "group_a",
"group_a", "group_b", "group_b"),
value = c(4, 5 , 48, 54, 12, 12, 1),
row_name = c("1", "2", "3", "4", "5", "6", "7"),
overlaps = c("2", "3, 5", "4, 5", "5", "", "7", ""))

我不知道这是否是一个非常复杂的问题,但我被困了几个小时,我没有想出如何解决它。

有人对我如何使用 dplyr 或 data.table 解决这个问题有任何建议吗?

最佳答案

strsplit overlaps 列,仅子集为 data$value > 10 的列,然后使用该组不同的 row_name 0覆盖原来的数据:

gr10 <- data$value > 10
sel <- Map(paste, data$group[gr10], strsplit(data$overlaps, ",\\s+")[gr10], sep="|")
sel <- Reduce(union, sel)
sel
#[1] "group_a|4" "group_a|5" "group_a|" "group_b|7"
data$value[do.call(paste, c(data[c("group","row_name")], sep="|")) %in% sel] <- 0
data
# group value row_name overlaps
#1 group_a 4 1 2
#2 group_a 5 2 3, 5
#3 group_a 48 3 4, 5
#4 group_a 0 4 5
#5 group_a 0 5
#6 group_b 12 6 7
#7 group_b 0 7

如果 row_name 在整个数据集中是唯一的,您可以使用更简单的逻辑:

sel <- Reduce(union, strsplit(data$overlaps, ",\\s+")[data$value > 10])
sel
#[1] "4" "5" "7"
data$value[data$row_name %in% sel] <- 0

额外的 data.table 解决方案:

library(data.table)
setDT(data)

data[
data[value > 10, .(row_name=unlist(strsplit(overlaps, ",\\s+"))), by=group],
on=.(group, row_name),
value := 0
]

关于R - 根据数据框中的条件按组设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70012057/

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