Сопоставление столбцов в R

У меня есть несколько лет данных с уникальными справочными кодами, я хочу отслеживать, как справочные коды появляются в данных с течением времени, есть ли у кого-нибудь способ сделать это? Я приведу пример того, что я ищу.
Вот как могут выглядеть данные:

2005 г.2006 г.2007 г.
928375037548234254654656
349234781304948398769879
...............
0934082323049230988775

и что я хочу сделать, так это сопоставить уникальные ссылки за эти годы и оставить пробелы там, где они могут не появиться:

2005 г.2006 г.2007 г.
928375039283750392837503
34923478нет34923478
...............
09340823нетнет
нет2304923нет

Ваш пример не ясен. Почему 928... повторяется через все 3 года выпуска, а 349... нет?

jdobres 06.04.2022 16:00

Какова ваша структура входных данных? Они все в одном фрейме данных? Или отдельные кадры/векторы данных для каждого года? Это кажется довольно простой full_join операцией, но ее трудно понять, не понимая, что вы вводите. Ваш пример странный, потому что ваш ввод имеет 2005 и 2006 годы, а ваш вывод также имеет 2007 год, казалось бы, из ниоткуда...

Gregor Thomas 06.04.2022 16:03

Пожалуйста, поделитесь небольшим, но воспроизводимым примером ввода, либо с кодом R для создания объекта, либо с dput() (который создает код R для создания объекта, например, dput(your_data[1:5, ]) для первых 5 строк фрейма данных с именем your_data).

Gregor Thomas 06.04.2022 16:05

@GregorThomas на данный момент они находятся в отдельных фреймах данных, только с данными за один год и одним столбцом.

Lucy 06.04.2022 16:20

Отлично. Пожалуйста, поделитесь несколькими строками из 3 фреймов данных воспроизводимо. dput(your_2005_data[1:5, , drop = FALSE]), dput(your_2006_data[1:5, , drop = FALSE]), dput(your_2007_data[1:5, , drop = FALSE]). Затем мы можем протестировать код, чтобы решить вашу проблему. Мы, вероятно, захотим собрать все соответствующие фреймы данных в list, поэтому, если есть шаблон в том, как они названы, было бы полезно знать.

Gregor Thomas 06.04.2022 16:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это может быть не самый простой/быстрый способ, но мой метод будет заключаться в повороте/развороте.

library(tidyverse)

data %>%
  pivot_longer(cols = colnames(data), #this assumes that only your years are the columns in the data.
               names_to = "year",
               values_to = "code") %>%
  mutate(id_code = code) %>% #This will line up the codes on the same row in the next step.
  pivot_wider(id_cols = "id_code",
              names_from = "year",
              values_from = "code",
              values_fill = NULL #This will ensure that all the missing values are the same, change if appropriate.
              ) %>%
  select(-id_code) #drop the id column if no longer required.

Я думаю, что это было бы проще, чем использовать соединения, но могут быть и лучшие способы, кто-то может прийти с решением rowwise().

Ответ принят как подходящий

код

library(data.table)

Reduce(f = function(x, y) merge(x, y, by = c("i"), all = T), lapply(list(df1, df2, df3), function(x) setDT(x)[, i := x[, 1L]]))

Пример данных

df1 <- data.frame(`2005` = c(1,3,6,7,12))
df2 <- data.frame(`2006` = c(12,2,4,7,10))
df3 <- data.frame(`2007` = c(4,100))

полученные результаты

#      i X2005 X2006 X2007
# 1:   1     1    NA    NA
# 2:   2    NA     2    NA
# 3:   3     3    NA    NA
# 4:   4    NA     4     4
# 5:   6     6    NA    NA
# 6:   7     7     7    NA
# 7:  10    NA    10    NA
# 8:  12    12    12    NA
# 9: 100    NA    NA   100

детальное объяснение

Здесь один лайнер разбивается на три строки (шага).

Вы упомянули, что ваши data.frames хранятся отдельно, поэтому мы добавляем их в список.

dfs <- list(df1, df2, df3)

Затем мы применяем к каждой из ваших таблиц в списке и создаем универсальный столбец, который мы можем объединить позже, столбец будет называться «i». setDT превращает data.frames в data.table, а i := x[x, 1L] гарантирует, что значение i будет вашим значением.

dfs <- lapply(dfs, function(x) setDT(x)[, i := x[, 1L]])

Затем мы можем использовать базовую функцию Reduce, чтобы объединить список таблиц в универсальном столбце i. Функция сокращения имеет два значения: x — это предыдущий результат (объединение), а y — новое значение (следующая таблица для слияния).

Reduce(f = function(x, y) merge(x, y, by = c("i"), all = T), dfs)

Другие вопросы по теме