Новая колонка с условиями в tidyverse

#r #tidyverse

Вопрос:

Я хочу добавить столбец days в набор данных с некоторыми условиями. Для каждой почвы в столбце должно быть девять строк days . Первые две строки ( 0 и 4 ) должны быть значением из SS Period . Значение для days 10 66 должно быть N в Period , а ES в Period должно быть последним days .

Это очень плохое объяснение, которое я знаю, но я думаю, что, возможно, оно имеет смысл, если посмотреть на набор данных expected_df.

Вся помощь очень ценится!

 df <- structure(list(soil = c(12L, 5L, 3L, 12L, 5L, 3L, 12L, 3L, 5L
), ITS_1 = c(290900, 16090, 12460, 0, 19700, 25000, 114.2, 39100, 
25090), Period = c("ES", "ES", "ES", "N", "N", "N", "SS", "SS", 
"SS")), row.names = c(NA, -9L), class = "data.frame")**strong text**
 

Вот как должны выглядеть данные

 expected_df <- structure(list(soil = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 12L, 12L, 12L, 12L, 12L, 12L, 
5L, 5L, 5L), ITS_1 = c(39100, 39100, 25000, 25000, 25000, 25000, 
12460, 12460, 12460, 25090, 25090, 19700, 19700, 19700, 19700, 
16090, 16090, 16090, 114.2, 114.2, 0, 0, 0, 0, 16090, 16090, 
16090), Period = c("SS", "SS", "N", "N", "N", "N", "ES", "ES", 
"ES", "SS", "SS", "N", "N", "N", "N", "ES", "ES", "ES", "SS", 
"SS", "N", "N", "N", "N", "ES", "ES", "ES"), days = c(0L, 4L, 
10L, 17L, 24L, 66L, 81L, 94L, 116L, 0L, 4L, 10L, 17L, 24L, 66L, 
81L, 94L, 116L, 0L, 4L, 10L, 17L, 24L, 66L, 81L, 94L, 116L)), class = "data.frame", row.names = c(NA, 
-27L))
 

Ответ №1:

Одним из решений является создание фрейма данных и left_join() .

 library(dplyr)
df_join <- data.frame(days = c(0, 4, 10, 17, 24, 66, 81, 94, 116),
                      Period = rep(c("SS", "N", "ES"), times = c(2, 4, 3)))

df %>% 
  left_join(df_join, by = "Period")

#    soil    ITS_1 Period days
# 1    12 290900.0     ES   81
# 2    12 290900.0     ES   94
# 3    12 290900.0     ES  116
# 4     5  16090.0     ES   81
# 5     5  16090.0     ES   94
# 6     5  16090.0     ES  116
# 7     3  12460.0     ES   81
# 8     3  12460.0     ES   94
# 9     3  12460.0     ES  116
# 10   12      0.0      N   10
# 11   12      0.0      N   17
# 12   12      0.0      N   24
# 13   12      0.0      N   66
# 14    5  19700.0      N   10
# 15    5  19700.0      N   17
# 16    5  19700.0      N   24
# 17    5  19700.0      N   66
# 18    3  25000.0      N   10
# 19    3  25000.0      N   17
# 20    3  25000.0      N   24
# 21    3  25000.0      N   66
# 22   12    114.2     SS    0
# 23   12    114.2     SS    4
# 24    3  39100.0     SS    0
# 25    3  39100.0     SS    4
# 26    5  25090.0     SS    0
# 27    5  25090.0     SS    4