У меня есть два фрейма данных для сравнения, но столбцы немного отличаются

Я хочу сравнить следующие два кадра данных, чтобы сравнить их со вторым и убедиться, что какое-либо из моих значений выше. Основная проблема здесь в том, что столбцы имеют немного разные имена. Для справки мой фрейм данных выглядит так:

myDat
firstA firstB secondA secondB thirdA  thirdB    
   13     4      40        24    16      10

comparisonDat
first second third
  18    35     8

Моя конечная цель - сравнить кадры данных, сравнивая «firstA» и «firstB» с «first» и т. д. в моем сравненииDat, чтобы проверить, что они не являются более высоким значением, и если они возвращают подмножество моих данных, как показано ниже, как это значения, которые выше;

myDat_comparison
secondA thirdA  thirdB
  40      16      10

Я чувствую, что это можно сделать с помощью простого оператора, что-то вроде myDat[который(myDat > CompareDat),], если имена моих столбцов должны совпадать. Я не совсем уверен, как это исправить, я думаю, самый простой способ - это gsub() версии A и B из моих данных, хотя я не уверен, что это сработает, и это не позволит мне идентифицировать после

Вы пытаетесь сравнить итоговые значения по столбцам или построчно? Кроме того, можете ли вы предоставить воспроизводимый пример вашего набора данных? Было бы проще помочь - руководство, если оно вам нужно stackoverflow.com/collectives/r-language/articles/76995406/…

Mark Druffel 06.09.2024 19:07
Стоит ли изучать 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
1
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Предполагая, что каждый столбец в comparisonDat имеет одно значение, преобразуйте myDat в длинный формат и отфильтруйте значения на основе столбцов из comparisonDat. Затем преобразуйте отфильтрованные данные обратно в широкий формат.

library(dplyr)
library(tidyr)

myDat |> 
  rename_with(.fn=function(x) gsub("(\\w+)([AB])", "\\1_\\2", x), .cols=everything()) |> 
  pivot_longer(cols=everything(), names_to = "var", values_to = "value") |> 
  separate_wider_delim(cols=var, delim = "_", names=c("group", "letter")) |> 
  filter(case_when(
    group == "first" ~ value > comparisonDat$first,
    group == "second" ~ value > comparisonDat$second,
    group == "third" ~ value > comparisonDat$third
  )) |> 
  pivot_wider(names_from=c(group, letter), values_from=value, names_sep = "")

# A tibble: 1 × 3
  secondA thirdA thirdB
    <int>  <int>  <int>
1      40     16     10

данные

myDat <- read.table(text = "firstA firstB secondA secondB thirdA  thirdB    
   13     4      40        24    16      10", header=TRUE)
comparisonDat <- read.table(text = "first second third
  18    35     8", header=TRUE)

1) Вот мурлыкающее решение. Для каждого имени в comparisonDat найдите соответствующие столбцы в myDat, а затем используйте keep, чтобы отфильтровать их до тех, которые удовлетворяют неравенству.

library(purrr)

map_dfc(names(comparisonDat), ~ {
  keep(myDat[grep(.x, names(myDat))], \(x) x > comparisonDat[.x])
})
##   secondA thirdA thirdB
## 1      40     16     10

2) В базе R аналогично. Используйте Filter вместо keep и do.call("cbind", lapply(...)) вместо map_dfc.

do.call("cbind", lapply(names(comparisonDat), \(.x) {
  Filter(\(x) x > comparisonDat[.x], myDat[grep(.x, names(myDat))])
}))
##   secondA thirdA thirdB
## 1      40     16     10

Примечание

Входные данные в воспроизводимой форме:

comparisonDat <- data.frame(first = 18L, second = 35L, third = 8L)
myDat <- data.frame(firstA = 13L, firstB = 4L, secondA = 40L, secondB = 24L,
  thirdA = 16L, thirdB = 10L)

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