Вставьте указанные значения в R сгруппированных df и заполните недостающие значения, используя другой df (R) - PullRequest
1 голос
/ 09 января 2020

У меня есть 2 dfs: df & xdf .

df <- tibble(id = c("a", "a", "a", "a", "b", "b", "b", "b"),
             x = c(1, 2, 3, 4, 1, 2, 3, 4),
             y = c(0.2, 0, 0.9, 7, 1, 0.3, 5, 5.1))

xdf <- tibble(id = c("a", "b"),
              x = c(2, 3.5))

В df , в столбце "id", для группы (a & b), я хотел бы вставить только ту строку xdf , которая совпадает с тем же именем идентификатора, что и в df. Как я могу это сделать? Я попробовал следующие команды, но все значения xdf $ x вставлены для каждой группы.

ndf <- df %>%
  group_by(id) %>% 
  do(add_row(., id = .$id[1], x = xdf$x))

> ndf
# A tibble: 12 x 3
# Groups:   id [2]
   id        x     y
   <chr> <dbl> <dbl>
 1 a       1     0.2
 2 a       2     0  
 3 a       3     0.9
 4 a       4     7  
 5 a       2    NA  
 6 a       3.5  NA  
 7 b       1     1  
 8 b       2     0.3
 9 b       3     5  
10 b       4     5.1
11 b       2    NA  
12 b       3.5  NA

# expected result should be : ndf <- ndf[c(-6,-11),]

Моя конечная цель - наполнить этих новорожденных NA из ndf функцией ок (). Но моя проблема остается, потому что я использую xout = xdf $ x , который вызывает нештатные значения. Как я могу преодолеть это? Можете ли вы помочь написать функцию, которая меняет xout ?

f <- function(z) 
{
  fdf <- approx(z$x, z$y, xout = xdf$x, method = "linear")
  return(data.frame(nx= fdf$x, y.out = fdf$y, id = unique(z$id)))
}

jdf <- as.data.frame(ddply(ndf, .(id),  f))
zdf <- subset(jdf, select = c(id, nx, y.out))

> zdf
  id  nx y.out
1  a 2.0  0.00
2  a 3.5  3.95
3  b 2.0  0.30
4  b 3.5  5.05

# expected results
  id  nx y.out
1  a 2.0  0.00
2  b 3.5  5.05

Любые полезные советы по этому поводу приветствуются. Большое спасибо!

1 Ответ

1 голос
/ 09 января 2020
library(dplyr)

df <- tibble(id = c("a", "a", "a", "a", "b", "b", "b", "b"),
             x = c(1, 2, 3, 4, 1, 2, 3, 4),
             y = c(0.2, 0, 0.9, 7, 1, 0.3, 5, 5.1))

xdf <- tibble(id = c("a", "b"),
              x = c(2, 3.5))

ndf <- df %>%
  bind_rows(xdf) %>% 
  arrange(id)

zdf <- ndf %>%
  group_by(id) %>%
    group_modify(~mutate(., y_approx = approx(.$x, .$y, .$x, method = "linear")[["y"]])) %>%
    ungroup() %>%
  filter(is.na(y)) %>%
  select(id, y_approx)
...