Объединить строку в одну с условием и заменить значение в одной строке значением в другой R

#r #conditional-statements #row

#r #условные операторы #строка

Вопрос:

У меня есть набор данных, который выглядит так в R:

 A <- c("X", "Y", "Z", "W", "U")
B <- c("apple", "pear", "apple", "pear", "pear")
C <- c("december", "december" ,"June", "june", "march")
D <- c("Winter", "Summer" ,"Winter", "Summer", "Summer")
df <- data.frame(A,B,C,D);df

  A     B        C      D
1 X apple december Winter
2 Y  pear december Summer
3 Z apple     June Winter
4 W  pear     june Summer
5 U  pear    march Summer
 

Я хотел бы объединить строку по столбцу C (чтобы смешать строку 1 со строкой 2 и строку 3 со строкой 4), но я также хочу заменить значение в строке B, принимая во внимание столбец D. В принципе, когда 2 значения являются неопределенными в C (например, «декабрь»), что значениезначение в B, когда D — «Лето» («груша»), всегда заменяется значением в B, когда D — «Зима» (яблоко)
Я хотел бы иметь в конце такой фрейм данных :

   A     B        C             D
1 X apple december Winter,Summer
2 Z apple     june Winter,Summer
3 U  pear    march        Summer
 

Я действительно хочу сохранить 2 значения в столбце D, когда были объединены 2 строки.

У кого-нибудь есть идея?

Ответ №1:

Опция data.table

 setDT(df)[
  ,
  c(
    lapply(
      setNames(.(A, B), c("A", "B")),
      function(x) if ("Winter" %in% D) replace(x, D == "Summer", x[D == "Winter"]) else x
    ),
    .(D = D)
  ),
  C
][
  ,
  lapply(.SD, function(x) toString(unique(x))),
  C
][,
  .SD,
  .SDcols = names(df)
]
 

дает

    A     B        C              D
1: X apple december Winter, Summer
2: Z apple     june Winter, Summer
3: U  pear    march         Summer
 

Данные

 > dput(df)
structure(list(A = c("X", "Y", "Z", "W", "U"), B = c("apple",
"pear", "apple", "pear", "pear"), C = c("december", "december",
"june", "june", "march"), D = c("Winter", "Summer", "Winter",
"Summer", "Summer")), class = "data.frame", row.names = c(NA,
-5L))
 

Комментарии:

1. Спасибо! это работает хорошо. У меня есть еще один вопрос по этому поводу. Если у меня есть NA в столбце C, как я могу сделать так, чтобы они не были объединены вместе?

Ответ №2:

Опция с dplyr

 library(dplyr)
library(tidyr)
df %>% 
    group_by(C = tolower(C)) %>% 
    mutate(across(c(A, B), ~ if(n_distinct(D) > 1) replace(., D %in% 'Summer', NA) else
         .)) %>%
    fill(c(A, B)) %>% 
    summarise(across(c(A, B), first), D = toString(D), .groups = 'drop')
# A tibble: 3 x 4
#  C        A     B     D             
#* <chr>    <chr> <chr> <chr>         
#1 december X     apple Winter, Summer
#2 june     Z     apple Winter, Summer
#3 march    U     pear  Summer        
 
 

Комментарии:

1. Спасибо. Я попробовал этот код с аналогичным data.frame, чем тот, который я отправил, но с символами, а не с факторами. В итоге у меня есть NA в столбцах A и B… Причина почему?

2. @VG-29 Можете ли вы попробовать преобразовать в символьный класс, т.е. df %>% type.convert(as.is = TRUE) %>% group_by(..