#r
#r
Вопрос:
У меня есть 1 фрейм данных, подобный этому
id date_0_0 date_1_0 date_2_0 date_3_0 type_0_0 type_1_0 type_2_0 type_3_0
1 5/17/1966 . . . C10 . . .
2 3/7/2012 . . . C34 . . .
3 . . . . . . . .
4 5/11/1998 . . 2/1/1984 C34 . . C34
Они date_?_0
соответствуют type_?_0
, и у меня есть около 200 наборов этих переменных.
Что мне нужно сделать, так это создать новую переменную, давайте назовем ее cancer
.
Если у кого-то не было C34 среди их type_?_0
переменных, то их cancer
= N / A.
Если у кого-то есть C34 среди их type_?_0
переменных, то их cancer
= соответствующая дата.
Если у кого-то есть несколько C34 среди их type_?_0
переменных, то их cancer
= их минимальная соответствующая дата.
Итак, мой идеальный результат
id cancer
1 .
2 3/7/2012
3 .
4 2/1/1984
Я должен сделать это в R, но я обычно использую SAS….In SAS Я просто создаю три массива: первый — date, второй — type и третий — cancer, затем я перебираю массив date и type, чтобы присвоить новые значения для массива cancer. Наконец, я создаю новую переменную, равную min (массив рака).
Пожалуйста, помогите. Спасибо!!!
Комментарии:
1. являются ли конечные
_0
вtype_?_0
иdate_?_0
релевантными? каковы переменные самого высокого типа и переменные даты в наборе данных?2. имена переменных: type_0_0-type_232_0 и date_0_0-date_232_0. _0 — это просто хвост, и он никогда не меняется.
Ответ №1:
Попробуй:
library(tidyverse)
df %>%
pivot_longer(-id) %>%
group_by(id, idx = gsub('.*(\d )_(\d )', '\1\2', name))%>%
mutate(value = case_when(any(value == 'C34') amp; grepl('\d \/', value) ~ value))%>%
group_by(id) %>%
arrange(as.Date(as.character(value), '%d/%m/%Y')) %>%
select(id, cancer = value) %>%
slice(1L)
Выходной сигнал:
# A tibble: 4 x 2
# Groups: id [4]
id cancer
<int> <fct>
1 1 NA
2 2 3/7/2012
3 3 NA
4 4 2/1/1984