library(tidyverse)
df <- iris %>%
group_by(Species) %>%
mutate(Petal.Dim = Petal.Length * Petal.Width,
rank = rank(desc(Petal.Dim))) %>%
mutate(new_col = rank == 4, Sepal.Width)
table <- df %>%
filter(rank == 4) %>%
select(Species, new_col = Sepal.Width)
correct_df <- left_join(df, table, by = "Species")
df
#> # A tibble: 150 x 8
#> # Groups: Species [3]
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species Petal.Dim
#> <dbl> <dbl> <dbl> <dbl> <fct> <dbl>
#> 1 5.1 3.5 1.4 0.2 setosa 0.280
#> 2 4.9 3 1.4 0.2 setosa 0.280
#> 3 4.7 3.2 1.3 0.2 setosa 0.26
#> 4 4.6 3.1 1.5 0.2 setosa 0.3
#> 5 5 3.6 1.4 0.2 setosa 0.280
#> 6 5.4 3.9 1.7 0.4 setosa 0.68
#> 7 4.6 3.4 1.4 0.3 setosa 0.42
#> 8 5 3.4 1.5 0.2 setosa 0.3
#> 9 4.4 2.9 1.4 0.2 setosa 0.280
#> 10 4.9 3.1 1.5 0.1 setosa 0.15
#> # ... with 140 more rows, and 2 more variables: rank <dbl>, new_col <lgl>
我基本上是在寻找new_col
来显示与Sepal.Width列中rank = 4对应的值。在这种情况下,这些值将是3.9、3.3和3.8。我设想这类似于VLookup或Excel中的索引/匹配。
答案 0 :(得分:0)
每当我想到“现在我需要像过去在Excel中一样使用VLOOKUP”时,我发现left_join()
函数很有用。它也是dplyr软件包的一部分。与其在一个表的另一个表中“查找”值,不如让R更容易地创建一个更大的表,其中一个表保持不变(此处是“左”一个或您在函数中输入的第一项),另一个是使用它们共有的一个或多个列作为索引添加。
在您的特定示例中,我无法完全理解您希望new_col
包含的内容。如果要在R中执行Excel样式的VLOOKUP,则left_join()
是最佳起点。
答案 1 :(得分:0)
该问题尚不清楚,因为它未提及Excel中的Vlookup或类似Index / Match的操作的目的。 另外,如果等级不等于4,您也不会提及“ new_col”应具有的值。 假设值为NA,下面的解决方案可以使用简单的ifelse进行工作:
df <- iris %>%
group_by(Species) %>%
mutate(Petal.Dim = Petal.Length * Petal.Width,
rank = rank(desc(Petal.Dim))) %>%
ungroup() %>%
mutate(new_col = ifelse(rank == 4, Sepal.Width,NA))
df