R, рекурсивно добавить текст из одной строки в другую по группе - PullRequest
0 голосов
/ 14 ноября 2018

Я хочу рекурсивно добавлять текст из одной строки в другую, используя информацию, хранящуюся в другом столбце.Ниже приведен пример набора данных:

df <- data_frame(person = c(rep("A",4),rep("B",3)),
               meal = c(seq(1:4),seq(1:3)),
               food = c("Chicken", "Beef", "Soup and meal 2", "Lamb and meal 3",
                        "Lamb","Salad and meal 1","Beef"),
               dependencies = c(NA,NA,2,3,NA,1,NA),
               solo_meal = c(1,1,0,1,1,0,1))

, который дает:

# A tibble: 7 x 5
  person  meal food             dependencies solo_meal
  <chr>  <int> <chr>                   <dbl>     <dbl>
1 A          1 Chicken                    NA         1
2 A          2 Beef                       NA         1
3 A          3 Soup and meal 2             2         0
4 A          4 Lamb and meal 3             3         1
5 B          1 Lamb                       NA         1
6 B          2 Salad and meal 1            1         0
7 B          3 Beef                       NA         1

Я хочу добавить столбец (предпочтительно с использованием tidyverse), который объединяет столбец пищи, чтобы он выглядел следующим образом:

  combined_meal         
  <chr>                 
1 Chicken               
2 Beef                  
3 Soup and Beef         
4 Lamb and Soup and Beef
5 Lamb                  
6 Salad and Lamb        
7 Beef               

Я думаю, что это должно быть сделано рекурсивно, но я не знаю, как это сделать в тидиверсе (или в этом смысле база).

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Вот решение с использованием цикла while.

library(dplyr)
library(stringr)
df <- data_frame(person = c(rep("A",4),rep("B",3)),
                 meal = c(seq(1:4),seq(1:3)),
                 food = c("Chicken", "Beef", "Soup and meal 2", "Lamb and meal 3",
                          "Lamb","Salad and meal 1","Beef"),
                 dependencies = c(NA,NA,2,NA,NA,1,NA),
                 solo_meal = c(1,1,0,1,1,0,1))

df2 <- df %>% mutate(combined_meal = food)

while(any(grepl("meal",df2$combined_meal))){
  df2 <- df2 %>%
    group_by(person) %>%
    mutate(mls = str_extract(combined_meal,"\\d"),
           f = combined_meal[strtoi(mls)],
           combined_meal = str_replace(combined_meal,"meal (\\d)",f)) %>%
    select(-mls,-f) %>% 
    ungroup()
}
df2

#> # A tibble: 7 x 6
#>   person  meal food            dependencies solo_meal combined_meal       
#>   <chr>  <int> <chr>                  <dbl>     <dbl> <chr>               
#> 1 A          1 Chicken                   NA         1 Chicken             
#> 2 A          2 Beef                      NA         1 Beef                
#> 3 A          3 Soup and meal 2            2         0 Soup and Beef       
#> 4 A          4 Lamb and meal 3           NA         1 Lamb and Soup and Beef
#> 5 B          1 Lamb                      NA         1 Lamb                
#> 6 B          2 Salad and meal~            1         0 Salad and Lamb      
#> 7 B          3 Beef                      NA         1 Beef
0 голосов
/ 14 ноября 2018

Мы можем попробовать это с accumulate

library(tidyverse)
map_df(split(df, df$person), function(x) {
    i = which(grepl('meal', x$food))
    i1 <- i[1] -1
    i2 <- i[length(i)]
    v1 <- x$food[i1:i2]
    v1 <- sub('and\\s*$', "", 
       sub("meal\\s+\\d+", "",  v1))  %>%
            accumulate(., c) %>%
               map_chr(~ .x %>% 
                            rev %>% 
                            paste(., collapse = ' and '))
   x$combined_meal <- x$food
   x$combined_meal[i1:i2] <- v1
   x})
# A tibble: 7 x 6
#  person  meal food             dependencies solo_meal combined_meal           
#  <chr>  <int> <chr>                   <dbl>     <dbl> <chr>                   
#1 A          1 Chicken                    NA         1 Chicken                 
#2 A          2 Beef                       NA         1 Beef                    
#3 A          3 Soup and meal 2             2         0 Soup  and Beef          
#4 A          4 Lamb and meal 3            NA         1 Lamb  and Soup  and Beef
#5 B          1 Lamb                       NA         1 Lamb                    
#6 B          2 Salad and meal 1            1         0 Salad  and Lamb         
#7 B          3 Beef                       NA         1 Beef    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...