0

说,我有数据集

df1=
structure(list(date = c("17.02.2021", "04.11.2020", "14.11.2020", 
"24.11.2020", "29.11.2020", "04.12.2020", "09.12.2020"), x1 = c(0L, 
0L, 7L, 0L, 0L, 0L, 0L), x2 = c(674L, 632L, 1036L, 656L, 736L, 
762L, 698L), x3 = c(698L, 712L, 1140L, 704L, 784L, 786L, 722L
), x4 = c(522L, 472L, 988L, 464L, 608L, 578L, 514L), x5 = c(2408L, 
3256L, 2840L, 2840L, 2888L, 2632L, 2648L), x6 = c(1952L, 2336L, 
2480L, 2208L, 2208L, 2144L, 2016L), x7 = c(1056L, 1120L, 1504L, 
1056L, 1184L, 1184L, 1120L), x8 = c(1984L, 2464L, 2400L, 2144L, 
2208L, 2144L, 2080L), x9 = c(2336L, 2976L, 2784L, 2464L, 2784L, 
2528L, 2400L), x10 = c(2528L, 3232L, 3104L, 2848L, 2912L, 2592L, 
2656L), x11 = c(1248L, 1312L, 1504L, 1312L, 1312L, 1312L, 1248L
)), class = "data.frame", row.names = c(NA, -7L))

每一行都是日期。对于第一天的数据配置文件在这里 在此处输入图像描述

第二天有数据资料 在此处输入图像描述

等等。

这里参考数据集

df2=structure(list(date = c("06.11.2019", "01.12.2019", "25.01.2020", 
"04.02.2020", "09.02.2020", "14.02.2020"), x1 = c(12L, 0L, 1L, 
6L, 23L, 1L), x2 = c(1272L, 1046L, 688L, 572L, 592L, 328L), x3 = c(1032L, 
974L, 736L, 780L, 800L, 568L), x4 = c(792L, 862L, 496L, 476L, 
592L, 296L), x5 = c(2232L, 1496L, 1784L, 2792L, 3064L, 3544L), 
    x6 = c(2976L, 1904L, 1632L, 1760L, 1376L, 1440L), x7 = c(1568L, 
    1248L, 1008L, 1120L, 992L, 800L), x8 = c(1888L, 1376L, 1632L, 
    2400L, 2464L, 2720L), x9 = c(2080L, 1504L, 1760L, 2848L, 
    2912L, 3296L), x10 = c(2400L, 1552L, 1824L, 2848L, 2928L, 
    3360L), x11 = c(2400L, 1504L, 1120L, 1040L, 784L, 736L)), class = "data.frame", row.names = c(NA, 
-6L))

有没有一种方法或方法可以将df1中每行数据的配置文件与参考数据集df2进行比较,如果配置文件相似,则为1,否则为0

两个数据集中的日期可能不同,主要问题是检测配置文件是否相似。

我想要的输出。彼得的代码很好,但是否可以通过变量计算配置文件之间的差异,例如 在此处输入图像描述

4

2 回答 2

2

此代码允许您直观地比较参考和df1配置文件。如您所见,没有一个配置文件完全匹配。一些配置文件是相似的,但没有@user2974951 指出的“相似”的定义,很难将其更接近答案。

library(dplyr)
library(tidyr)
library(ggplot2)


# restructure the data to allow comparison between the datasets

df <- 
  expand.grid("date_ref" = df2$date, "date_df1" = df1$date) %>% 
  left_join(df2, by = c("date_ref" = "date")) %>% 
  left_join(df1, by = c("date_df1" = "date")) %>% 
  pivot_longer(starts_with("x"), names_to = c("var", "df"), names_sep = "\\.") %>% 
  mutate(df = if_else(df == "x", "ref", "df1"),
         var = factor(var, paste0("x", 1:11)))

# now you can plot the data to compare profiles; had to add some formatting to make the graph readable.


ggplot(df, aes(var, value, group = df, colour = df))+
  geom_line()+
  facet_grid(date_ref~date_df1)+
  labs(colour = "Dataset")+
  theme_classic()+
  theme(legend.position = "bottom",
        axis.text.x = element_text(size = 6, angle = 90),
        axis.text.y = element_text(size = 6),
        strip.text = element_text(size = 6))

reprex 包于 2021-04-07 创建(v1.0.0)

于 2021-04-07T12:11:46.407 回答
0

您首先需要定义的是您想要使用什么相似性标准以及您的相似性阈值水平是多少(数据集需要有多相似才能被认为是等效的)。同样重要的因素是您的数据的性质。例如,您是否认为您的 x1..x11 是独立的或只是同一集合的不同样本。

根据答案,可以将每个 df1[i,2:12] 与 df2[i,2:12] 进行精确比较(如果它们只是重复或不重复)到将它们与 NA 进行比较并检查它们是否是两者都是 NA 或两者都是已知值。介于两者之间的方法是检查数据集每行的每个参数的差异是否不大于最小值的 0.05,如果所有参数都正常,或者使用皮尔逊相关系数(cor(x,y)函数默认启用)每行并将其值与 0.5 进行比较(当然,0.05 和 0.5 都是任意数字,它们可能需要进行一些调整)。或者,匹配点的数量(与整数完全比较或只是在某种程度上相似)对您来说可能是一个更好的指示。还有已知的样本组差异、时间序列差异或其他统计假设的标准测试。它们中的许多都可以在 R 中从捆绑包中获得,如果您喜欢其他东西,那么它很可能已经在您可以轻松下载和安装的额外包之一中获得。

于 2021-04-07T13:55:01.820 回答