根据 2 个外部向量识别行

Identify rows based on 2 external vectors

提问人:DylanMG 提问时间:10/15/2021 更新时间:10/15/2021 访问量:54

问:

我正在尝试标记具有与 2 个外部向量中的元素匹配的值的行。我需要这些值来匹配,这意味着它不能是任何情况,而是同时满足两个条件的东西(即不使用 %in% 运算符)。

这是我尝试过的:

widths <- c(1.2, 1.7, 1.8, 1.8, 1.9)
species <- c(rep("versicolor", 3), rep("virginica", 2))

iris_flagged <- iris %>%
  filter(Species != "setosa") %>%
  mutate(flag = ifelse((Petal.Width == widths & Species == species), "check", "")) %>%
  arrange(Species, Petal.Width) #to help with visualization

但是当我运行它时,会遗漏一些标志。如果查看数据,您会看到第 14、50、57、59、61:64 和 66:71 行缺少标志。

一个笨拙的、非鲁棒的方法可能看起来像这样,但我真的想让它变得健壮,并利用这些向量来发挥我的优势。

iris_flagged2 <- iris %>%
  filter(Species != "setosa") %>%
  mutate(flag = ifelse((Species == "versicolor" & Petal.Width == 1.2 |
                          Species == "versicolor" & Petal.Width == 1.7 |
                          Species == "versicolor" & Petal.Width == 1.8 |
                          Species == "virginica" & Petal.Width == 1.8 |
                          Species == "virginica" & Petal.Width == 1.9), 
                       "check", "")) %>%
  arrange(Species, Petal.Width) 

感谢您的帮助。我试图搜索,但不确定如何表达我的问题。

r dplyr 布尔逻辑

评论

0赞 akrun 10/15/2021
如果您正在执行浮点值,它可能不起作用,因为需要精度,即 并且会有所不同==1.21.20000001
0赞 DylanMG 10/15/2021
哇,感谢您的快速响应@akrun。我只是尝试通过将宽度和 iris$Petal.Widths 切换到字符类型来做到这一点,但仍然遇到同样的问题。在我的真实数据集中,我尝试在字符和整数数据上执行此操作。
0赞 akrun 10/15/2021
我会对两个数据集中的值进行四舍五入以使精度正确,然后在构建键/值数据集后进行连接
0赞 DylanMG 10/19/2021
@akrun 我没有尝试在浮点值上执行此操作,因此我认为这对我的特定问题没有帮助,但可能适用于在浮点值上尝试此操作的人。希望其他人能发现您的评论有用。

答:

2赞 TarJae 10/15/2021 #1

除了@akrun的评论之外,这里还有适合您任务的可能解决方案:

library(dplyr)
iris %>% 
  mutate(across(-Species, ~round(.,1)),
         flag = ifelse(Petal.Width %in% widths &
                         Species %in% species, "check",""))

输出:

    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species  flag
1            5.1         3.5          1.4         0.2     setosa      
2            4.9         3.0          1.4         0.2     setosa      
3            4.7         3.2          1.3         0.2     setosa      
4            4.6         3.1          1.5         0.2     setosa      
5            5.0         3.6          1.4         0.2     setosa      
6            5.4         3.9          1.7         0.4     setosa      
7            4.6         3.4          1.4         0.3     setosa      
8            5.0         3.4          1.5         0.2     setosa      
9            4.4         2.9          1.4         0.2     setosa      
10           4.9         3.1          1.5         0.1     setosa      
11           5.4         3.7          1.5         0.2     setosa      
12           4.8         3.4          1.6         0.2     setosa      
13           4.8         3.0          1.4         0.1     setosa      
14           4.3         3.0          1.1         0.1     setosa      
15           5.8         4.0          1.2         0.2     setosa      
16           5.7         4.4          1.5         0.4     setosa      
17           5.4         3.9          1.3         0.4     setosa      
18           5.1         3.5          1.4         0.3     setosa      
19           5.7         3.8          1.7         0.3     setosa      
20           5.1         3.8          1.5         0.3     setosa      
21           5.4         3.4          1.7         0.2     setosa      
22           5.1         3.7          1.5         0.4     setosa      
23           4.6         3.6          1.0         0.2     setosa      
24           5.1         3.3          1.7         0.5     setosa      
25           4.8         3.4          1.9         0.2     setosa      
26           5.0         3.0          1.6         0.2     setosa      
27           5.0         3.4          1.6         0.4     setosa      
28           5.2         3.5          1.5         0.2     setosa      
29           5.2         3.4          1.4         0.2     setosa      
30           4.7         3.2          1.6         0.2     setosa      
31           4.8         3.1          1.6         0.2     setosa      
32           5.4         3.4          1.5         0.4     setosa      
33           5.2         4.1          1.5         0.1     setosa      
34           5.5         4.2          1.4         0.2     setosa      
35           4.9         3.1          1.5         0.2     setosa      
36           5.0         3.2          1.2         0.2     setosa      
37           5.5         3.5          1.3         0.2     setosa      
38           4.9         3.6          1.4         0.1     setosa      
39           4.4         3.0          1.3         0.2     setosa      
40           5.1         3.4          1.5         0.2     setosa      
41           5.0         3.5          1.3         0.3     setosa      
42           4.5         2.3          1.3         0.3     setosa      
43           4.4         3.2          1.3         0.2     setosa      
44           5.0         3.5          1.6         0.6     setosa      
45           5.1         3.8          1.9         0.4     setosa      
46           4.8         3.0          1.4         0.3     setosa      
47           5.1         3.8          1.6         0.2     setosa      
48           4.6         3.2          1.4         0.2     setosa      
49           5.3         3.7          1.5         0.2     setosa      
50           5.0         3.3          1.4         0.2     setosa      
51           7.0         3.2          4.7         1.4 versicolor      
52           6.4         3.2          4.5         1.5 versicolor      
53           6.9         3.1          4.9         1.5 versicolor      
54           5.5         2.3          4.0         1.3 versicolor      
55           6.5         2.8          4.6         1.5 versicolor      
56           5.7         2.8          4.5         1.3 versicolor      
57           6.3         3.3          4.7         1.6 versicolor      
58           4.9         2.4          3.3         1.0 versicolor      
59           6.6         2.9          4.6         1.3 versicolor      
60           5.2         2.7          3.9         1.4 versicolor      
61           5.0         2.0          3.5         1.0 versicolor      
62           5.9         3.0          4.2         1.5 versicolor      
63           6.0         2.2          4.0         1.0 versicolor      
64           6.1         2.9          4.7         1.4 versicolor      
65           5.6         2.9          3.6         1.3 versicolor      
66           6.7         3.1          4.4         1.4 versicolor      
67           5.6         3.0          4.5         1.5 versicolor      
68           5.8         2.7          4.1         1.0 versicolor      
69           6.2         2.2          4.5         1.5 versicolor      
70           5.6         2.5          3.9         1.1 versicolor      
71           5.9         3.2          4.8         1.8 versicolor check
72           6.1         2.8          4.0         1.3 versicolor      
73           6.3         2.5          4.9         1.5 versicolor      
74           6.1         2.8          4.7         1.2 versicolor check
75           6.4         2.9          4.3         1.3 versicolor      
76           6.6         3.0          4.4         1.4 versicolor      
77           6.8         2.8          4.8         1.4 versicolor      
78           6.7         3.0          5.0         1.7 versicolor check
79           6.0         2.9          4.5         1.5 versicolor      
80           5.7         2.6          3.5         1.0 versicolor      
81           5.5         2.4          3.8         1.1 versicolor      
82           5.5         2.4          3.7         1.0 versicolor      
83           5.8         2.7          3.9         1.2 versicolor check
84           6.0         2.7          5.1         1.6 versicolor      
85           5.4         3.0          4.5         1.5 versicolor      
86           6.0         3.4          4.5         1.6 versicolor      
87           6.7         3.1          4.7         1.5 versicolor      
88           6.3         2.3          4.4         1.3 versicolor      
89           5.6         3.0          4.1         1.3 versicolor      
90           5.5         2.5          4.0         1.3 versicolor      
91           5.5         2.6          4.4         1.2 versicolor check
92           6.1         3.0          4.6         1.4 versicolor      
93           5.8         2.6          4.0         1.2 versicolor check
94           5.0         2.3          3.3         1.0 versicolor      
95           5.6         2.7          4.2         1.3 versicolor      
96           5.7         3.0          4.2         1.2 versicolor check
97           5.7         2.9          4.2         1.3 versicolor      
98           6.2         2.9          4.3         1.3 versicolor      
99           5.1         2.5          3.0         1.1 versicolor      
100          5.7         2.8          4.1         1.3 versicolor      
101          6.3         3.3          6.0         2.5  virginica      
102          5.8         2.7          5.1         1.9  virginica check
103          7.1         3.0          5.9         2.1  virginica      
104          6.3         2.9          5.6         1.8  virginica check
105          6.5         3.0          5.8         2.2  virginica      
106          7.6         3.0          6.6         2.1  virginica      
107          4.9         2.5          4.5         1.7  virginica check
108          7.3         2.9          6.3         1.8  virginica check
109          6.7         2.5          5.8         1.8  virginica check
110          7.2         3.6          6.1         2.5  virginica      
111          6.5         3.2          5.1         2.0  virginica      
112          6.4         2.7          5.3         1.9  virginica check
113          6.8         3.0          5.5         2.1  virginica      
114          5.7         2.5          5.0         2.0  virginica      
115          5.8         2.8          5.1         2.4  virginica      
116          6.4         3.2          5.3         2.3  virginica      
117          6.5         3.0          5.5         1.8  virginica check
118          7.7         3.8          6.7         2.2  virginica      
119          7.7         2.6          6.9         2.3  virginica      
120          6.0         2.2          5.0         1.5  virginica      
121          6.9         3.2          5.7         2.3  virginica      
122          5.6         2.8          4.9         2.0  virginica      
123          7.7         2.8          6.7         2.0  virginica      
124          6.3         2.7          4.9         1.8  virginica check
125          6.7         3.3          5.7         2.1  virginica      
126          7.2         3.2          6.0         1.8  virginica check
127          6.2         2.8          4.8         1.8  virginica check
128          6.1         3.0          4.9         1.8  virginica check
129          6.4         2.8          5.6         2.1  virginica      
130          7.2         3.0          5.8         1.6  virginica      
131          7.4         2.8          6.1         1.9  virginica check
132          7.9         3.8          6.4         2.0  virginica      
133          6.4         2.8          5.6         2.2  virginica      
134          6.3         2.8          5.1         1.5  virginica      
135          6.1         2.6          5.6         1.4  virginica      
136          7.7         3.0          6.1         2.3  virginica      
137          6.3         3.4          5.6         2.4  virginica      
138          6.4         3.1          5.5         1.8  virginica check
139          6.0         3.0          4.8         1.8  virginica check
140          6.9         3.1          5.4         2.1  virginica      
141          6.7         3.1          5.6         2.4  virginica      
142          6.9         3.1          5.1         2.3  virginica      
143          5.8         2.7          5.1         1.9  virginica check
144          6.8         3.2          5.9         2.3  virginica      
145          6.7         3.3          5.7         2.5  virginica      
146          6.7         3.0          5.2         2.3  virginica      
147          6.3         2.5          5.0         1.9  virginica check
148          6.5         3.0          5.2         2.0  virginica      
149          6.2         3.4          5.4         2.3  virginica      
150          5.9         3.0          5.1         1.8  virginica check

评论

1赞 DylanMG 10/15/2021
谢谢@TarJae。不过,这并不是我想要的。使用 %in% 运算符意味着它将标记所有情况。在您的输出行中,107 正在获得一个标志,其中 species == “virginica” 和 Petal.Width == 1.7。在我的“笨拙”例子中,我试图证明这不是我想要的。
2赞 Ronak Shah 10/15/2021 #2

这是用于传递每对条件并将它们组合为一体的一种方法。map2reduce

library(tidyverse)

iris2 <- iris %>% filter(Species != "setosa") 

iris2 <- iris2 %>%
  mutate(flag = ifelse(map2(species, widths, 
              ~Species == .x & Petal.Width == .y) %>% reduce(`|`), 'check', ''))

iris2

评论

0赞 DylanMG 10/19/2021
谢谢@Ronak,效果很好!多么优雅、快速的解决方案。我需要开始更多地接受 map() 函数。我喜欢你如何将该管道嵌套在 ifelse() 中以使其也能工作。非常光滑。