Объединение определенных столбцов совпадающих строк

#r

#r

Вопрос:

У меня есть этот фрейм данных:

 patientcA   1   2   NA   NA  b   c
patientcB   NA  NA  3     4  b   c
patientdA   3   3   NA   NA  d   e
patientdB   NA  NA  5     6  d   e

  

Как я могу объединить столбцы 2,3,4 и 5 для тех строк, которые совпадают в столбце 1, за исключением последнего символа. В этом случае первые две строки совпадают, за исключением последнего символа; и последние две строки делают то же самое. Итак, мой ожидаемый результат будет:

 patientcA   1   2   3   4  b   c
patientcB   1   2   3   4  b   c
patientdA   3   3   5   6  d   e
patientdB   3   3   5   6  d   e
  

Я пробовал что-то подобное, но я не знаю, что написать в качестве else аргумента. Более того, я думаю, что это не лучший подход:

 new_data$first_column<-ifelse(grepl('A$', original_data$first), original_data$first, ?)
  

Ответ №1:

Возможно, вы могли бы рассмотреть tidyverse подход, который использует separate для помещения последнего символа столбца 1 в новый столбец и fill замены NA значениями для того же пациента.

 library(tidyverse)

df %>%
  separate(V1, into = c("patient", "letter"), sep = -1) %>%
  group_by(patient) %>%
  fill(V2:V5, .direction = "downup")
  

Вывод

   patient  letter    V2    V3    V4    V5 V6    V7   
  <chr>    <chr>  <int> <int> <int> <int> <chr> <chr>
1 patientc A          1     2     3     4 b     c    
2 patientc B          1     2     3     4 b     c    
3 patientd A          3     3     5     6 d     e    
4 patientd B          3     3     5     6 d     e  
  

Ответ №2:

Вы могли бы написать векторизованную функцию, как CC() показано ниже, которая завершает столбцы, а затем разделить-применить-объединить с by .

 CC <- Vectorize(function(x) if (any(is.na(x))) rep(x[!is.na(x)], length(x)) else x)

res <- do.call(rbind.data.frame, by(dat, substr(dat$V1, 8, 8), CC))
res
#            V1 V2 V3 V4 V5 V6 V7
# c.1 patientcA  1  2  3  4  b  c
# c.2 patientcB  1  2  3  4  b  c
# d.1 patientdA  3  3  5  6  d  e
# d.2 patientdB  3  3  5  6  d  e