有没有办法使用mutate列中的表中的查找值?

时间:2019-01-05 03:36:28

标签: r dplyr

  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中的索引/匹配。

2 个答案:

答案 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

enter image description here