Я хочу сравнить следующие два кадра данных, чтобы сравнить их со вторым и убедиться, что какое-либо из моих значений выше. Основная проблема здесь в том, что столбцы имеют немного разные имена. Для справки мой фрейм данных выглядит так:
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 из моих данных, хотя я не уверен, что это сработает, и это не позволит мне идентифицировать после
Предполагая, что каждый столбец в 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)
Вы пытаетесь сравнить итоговые значения по столбцам или построчно? Кроме того, можете ли вы предоставить воспроизводимый пример вашего набора данных? Было бы проще помочь - руководство, если оно вам нужно stackoverflow.com/collectives/r-language/articles/76995406/…