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中的索引/匹配。
发布于 2019-01-05 13:14:06
每当我想“现在我需要像过去在Excel中一样使用VLOOKUP”时,我发现left_join()函数很有帮助。它也是dplyr包的一部分。与在另一个表的一个表中“查找”值不同,R只需创建一个较大的表,其中一个表保持不变(在这里是“左”字或您放入函数中的第一个术语),而另一个表是使用它们共同的一列或多列作为索引添加的。
在您的特定示例中,我不能完全理解您希望new_col包含什么内容。如果你想在R中使用Excel风格的VLOOKUP,那么left_join()是最好的起点。
发布于 2019-01-05 16:45:02
这个问题并不清楚,因为它没有提到来自Excel的Vlookup或类似索引/匹配的操作的目的。而且,如果排名不等于4,你也没有提到"new_col“应该有什么值。假设这个值是NA,下面的解决方案可以用一个简单的if:
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

https://stackoverflow.com/questions/54048750
复制相似问题