在R

时间:2018-08-27 16:16:06

标签: r

这是我第一次在Stack上提问,但是自从几年前开始编写代码以来,我经常使用它。它总是对我有很大帮助。

我有两个表,其中许多列定义了一些条件(两个表上的列数完全相同),主要的是“公司”和“价格”。我的主要想法是合并它们,这样我就可以在各列中获得每个公司的每个特征,并查看它们是否与我的匹配。由于它们始终不会具有完全相同的价格,因此我的想法是使用一个新的列,将价格四舍五入,以便将它们合并在一起。

我在R中基于四舍五入的价格列使用了join或merge函数(您将在下面看到)。但是,当我合并它时,无论使用哪个功能,都会使行混乱,并且最接近的价格点在列中未对齐,因此我无法对其进行比较...

 Company.ZZ Price.ZZ Price_round Company.XZ Price.XZ
 1          ZZ       80         100         XZ       82
 2          ZZ       80         100         XZ       93
 3          ZZ      175         200         XZ      220
 4          ZZ      175         200         XZ      240
 5          ZZ      175         200         XZ      248
 6          ZZ      243         200         XZ      220
 7          ZZ      243         200         XZ      240
 8          ZZ      243         200         XZ      248
 9          ZZ      251         300       <NA>       NA
 10         ZZ      309         300       <NA>       NA
 11         ZZ      351         400         XZ      413
 12         ZZ      351         400         XZ      439
 13         ZZ      385         400         XZ      413
 14         ZZ      385         400         XZ      439
 15         ZZ      393         400         XZ      413
 16         ZZ      393         400         XZ      439
 17         ZZ      646         600         XZ      602
 18         ZZ      646         600         XZ      625
 19         ZZ      693         700         XZ      706
 20         ZZ      706         700         XZ      706
 21         ZZ      718         700         XZ      706
 22         ZZ      854         900       <NA>       NA

我想得到的理想结果是'Price.ZZ'和'Price.XZ'列都按升序排列。注意:我试图使用安排或订购功能来做到这一点,但它不适用于两列,只能一一列出。

这是我使用的代码,该文件只是用Excel创建的带有两个列,公司名称和某些价格的随机文件。

 library(plyr)
 library(dplyr)
 library(data.table)
 table <- read.table( file.choose(), sep=";", header = TRUE)

 data_ZZ <- subset(table, table$Company == "ZZ")
 data_ZZ$Price_round <- round_any(data_ZZ$Price, 100)
 data_ZZ <- setDT(data_ZZ)[order(Price_round, Price)]
 colnames(data_ZZ) <- c("Company.ZZ", "Price.ZZ", "Price_round")
 data_YZ <- subset(table, table$Company == "YZ")
 data_YZ$Price_round <- round_any(data_YZ$Price, 100)
 data_YZ <- setDT(data_YZ)[order(Price_round, Price)]
 colnames(data_YZ) <- c("Company.YZ", "Price.YZ", "Price_round")
 data_XZ <- subset(table, table$Company == "XZ")
 data_XZ$Price_round <- round_any(data_XZ$Price, 100)
 data_XZ <- arrange(data_XZ, Price)
 colnames(data_XZ) <- c("Company.XZ", "Price.XZ", "Price_round")

 left_join(data_ZZ, data_XZ)

两天以来我一直在寻找解决方案...希望我很清楚,因为难以准确描述,但我会回答每个问题:)。

非常感谢。 高铁(Gautier)

1 个答案:

答案 0 :(得分:0)

我回答斯蒂芬,并给出更多的精确度,谢谢您的回答。

这是data_ZZ和data_XZ的头。它不是原始数据,但我尝试使用伪造的数据进行复制(我没有复制其他条件,仅复制了价格)。通常,存在一个数据集,其中包含不同的公司名称,价格点和有关这些价格点的特征。我需要查看是否匹配它们,这就是为什么我尝试按公司对它进行子集化,然后将价格四舍五入到最接近的100,所以我得到一个可以匹配的共同价格,因为它们的价格并不总是相同。而且在按照总价进行匹配之后,它变得混乱了,我无法进行比较。

head(Data_XZ)

Company.XZ Price.XZ Price_round ID
1         XZ       82         100  1
2         XZ       93         100  2
3         XZ      138         100  3
4         XZ      240         200  4
5         XZ      290         300  5
6         XZ      348         300  6

head(Data_YZ) same as ZZ

Company.YZ Price.YZ Price_round
 1:         YZ       76         100
 2:         YZ       93         100
 3:         YZ      146         100
 4:         YZ      240         200
 5:         YZ      280         300
 6:         YZ      348         300

我知道我一开始并不清楚,希望我的最初目标更加明确。

非常感谢。 高铁(Gautier)