Создайте новые переменные в R в соответствии с двумя наборами переменных

#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