#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