Есть ли способ использовать значение поиска из таблицы в столбце мутации? - PullRequest
0 голосов
/ 05 января 2019
  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, чтобы показать значение, которое соответствует rank = 4 из столбца Sepal.Width. В этом случае эти значения будут 3,9, 3,3 и 3,8. Я предполагаю, что это похоже на VLookup или Index / Match в Excel.

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Вопрос неясен, поскольку в нем не упоминается цель операции Vlookup или Index / Match, подобной Excel. Кроме того, вы не упоминаете, какое значение должно иметь «new_col», если rank не равен 4. Предполагая, что значение равно 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

0 голосов
/ 05 января 2019

Когда я думаю, что «теперь мне нужно использовать VLOOKUP, как в прошлом в Excel», я нахожу полезной функцию left_join(). Это также часть пакета dplyr. Вместо того, чтобы «искать» значения в одной таблице в другой таблице, для R проще создать одну большую таблицу, в которой одна таблица остается неизменной (здесь «левый» один или первый член, который вы поместили в функцию), а другой - добавлены с использованием столбца или столбцов, которые у них общего в качестве индекса.

В вашем конкретном примере я не могу полностью понять, что вы хотите new_col иметь в нем. Если вы хотите сделать VLOOKUP в стиле Excel в R, то left_join() - лучшая отправная точка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...