gpt4 book ai didi

删除几列中的重复值但保留行

转载 作者:行者123 更新时间:2023-12-04 02:27:44 24 4
gpt4 key购买 nike

我有一个如下所示的数据框:

dat <- data.frame(id=1:6,
z_1=c(100,290,38,129,0,290),
z_2=c(20,0,0,0,0,290),
z_3=c(0,0,38,0,0,98),
z_4=c(0,0,38,127,38,78),
z_5=c(23,0,25,0,0,98),
z_6=c(100,0,25,127,0,9))

数据

  id z_1 z_2 z_3 z_4 z_5 z_6
1 1 100 20 0 0 23 100
2 2 290 0 0 0 0 0
3 3 38 0 38 38 25 25
4 4 129 0 0 127 0 127
5 5 0 0 0 38 0 0
6 6 290 290 98 78 98 9

我想删除每一行中 z_x 的重复值,用 0NA 替换所有重复值,但保留行& 列完好无损(即不丢弃任何)。这里的 0 不算重复,它们是缺失值。列中的重复值是可以的。我理想的输出应该是这样的:

   id z_1 z_2 z_3 z_4 z_5 z_6
1 1 100 20 0 0 23 0
2 2 290 0 0 0 0 0
3 3 38 0 0 0 25 0
4 4 129 0 0 127 0 0
5 5 0 0 0 38 0 0
6 6 290 0 98 78 0 9

我真的不在乎 z_x 中的值以什么顺序出现,所以如果它们四处移动也没关系。有没有一种有效的方法来做到这一点,最好是以某种整洁的方式?我知道我可以旋转更长的时间并删除重复的行,但我的数据集非常大,我正在寻找一种无需旋转即可执行此操作的方法。

最佳答案

使用 apply 的基本 R 方式:

cols <- grep('z_\\d+', names(dat))
dat[cols] <- t(apply(dat[cols], 1, function(x) replace(x, duplicated(x), 0)))

# id z_1 z_2 z_3 z_4 z_5 z_6
#1 1 100 20 0 0 23 0
#2 2 290 0 0 0 0 0
#3 3 38 0 0 0 25 0
#4 4 129 0 0 127 0 0
#5 5 0 0 0 38 0 0
#6 6 290 0 98 78 0 9

tidyverse 无需 reshape 的方法可以使用 pmap 完成:

library(tidyverse)

dat %>%
mutate(result = pmap(select(., matches('z_\\d+')), ~{
x <- c(...)
replace(x, duplicated(x), 0)
})) %>%
select(id, result) %>%
unnest_wider(result)

由于@thelatemail 执行的测试表明 reshape 是比按行处理数据更好的选择,您可能需要考虑它。

dat %>%
pivot_longer(cols = matches('z_\\d+')) %>%
group_by(id) %>%
mutate(value = replace(value, duplicated(value), 0)) %>%
pivot_wider()

关于删除几列中的重复值但保留行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66234422/

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