gpt4 book ai didi

r - 有条件重复消除

转载 作者:行者123 更新时间:2023-12-02 05:08:10 24 4
gpt4 key购买 nike

给定以下数据框:

   z1 z2
1 A X
2 A Y
3 B X
4 B Y
5 C X
6 C Z
7 D X
8 D Z
9 E X
10 E Y
11 F X
12 G Z
13 H X
14 I Y
15 J X
16 K Z

我正在尝试找到一种更有效(比我想出的方法)的方法来消除第一列 z1 中的重复值,因为第二列 z2 中的值不是指定值” X”。这是我想要的输出:

   z1 z2
1 A X
3 B X
5 C X
7 D X
9 E X
11 F X
12 G Z
13 H X
14 I Y
15 J X
16 K Z
这里(和其他地方)有几篇关于消除基于多列的重复项的帖子,我已经尝试了各种形式的重复()和唯一(),但似乎无法找到执行此操作的正确编码。这个问题与我见过的其他帖子有点不同,因为要消除的行基于 z1 中存在的重复值,并以 z2 中的值为条件,但当 z1 中不存在重复项时,z2 上的条件不适用。我使用 subset() 提出了以下解决方案,但问题是我需要输入 z1 中重复的值才能使其工作。我当前的解决方案效率低下,因为我需要先通过另一个过程找到重复的值,然后将它们硬编码到子集命令中。

这是我一直在使用的数据框和代码:

z1=c(rep(c("A","B","C","D","E"),each=2),"F","G","H","I","J","K")
z2=c(rep(c("X","Y"),2),rep(c("X","Z"),2),rep(c("X","Y","X","Z"),2))
z=data.frame(cbind(z1,z2))

t1=subset(z,
(z$z1!="A" | z$z2=="X")&
(z$z1!="B" | z$z2=="X")&
(z$z1!="C" | z$z2=="X")&
(z$z1!="D" | z$z2=="X")&
(z$z1!="E" | z$z2=="X"))
t1

有什么想法吗?

最佳答案

您可以使用duplicatedfromLast=FfromLast=T 来确定 z1 值是否重复:

duplicated(z$z1) | duplicated(z$z1, fromLast=T)
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
# [14] FALSE FALSE FALSE

剩下的就是限制非重复或 X2 值为“X”的解决方案:

subset(z, !(duplicated(z1) | duplicated(z$z1, fromLast=T)) | z2 == "X")
# z1 z2
# 1 A X
# 3 B X
# 5 C X
# 7 D X
# 9 E X
# 11 F X
# 12 G Z
# 13 H X
# 14 I Y
# 15 J X
# 16 K Z

关于r - 有条件重复消除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21631802/

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