比较两个数据帧中的数据并隔离结果

时间:2016-07-05 03:01:41

标签: r dataframe compare

我有两个数据集,一个包含元素及其各自的值(数据框:All_data),另一个(数据框:Standard),其中我有每个比率的标准。 我想比较ALL_Data的哪些组件的所有变量都优于Standard中的变量。

> All_Data
   Ticker   ROA ROE ROI
1   A       0.0 2.0 3.0
2   B       5.0 3.8 7.0
3   C       1.0 0.0 2.0
4   D       3.0 1.0 5.0
5   E       4.0 4.0 6.0
6   F       2.0 5.0 4.0

> standard
    Label  Value
1   ROE     3.0  
2   ROA     3.5
3   ROIC    3.8

结果应为“E”和“B”。 这看起来很简单,但我不知道如何编码 我真的很感激任何帮助。 谢谢!

2 个答案:

答案 0 :(得分:1)

如果您将比较值放入向量standard,其向量与All_Data列的顺序相同,那么我们可以使用MapReduce功能解决问题:

sv = standard$Value[match(standard$Label, names(All_Data)[-1])]
sv
# [1] 3.5 3.0 3.8  # note here that the order will be ROA, ROE and ROI

All_Data$Ticker[Reduce('&', Map('>', All_Data[-1], sv))]
# [1] B E
# Levels: A B C D E F

稍微分解一下,因为您要将每列与标准数据中的相应值进行比较,您可以使用Map同时循环遍历列和值并进行比较,这将返回列表三个逻辑向量,表示每个元素是否大于该值,然后使用Reduce函数对三个向量应用&,以确保一行中的每个元素都大于相应的值。

数据 :(假设此处All_Data已转换为数据框,其中最后三列为数字类。)

dput(All_Data)
structure(list(Ticker = structure(1:6, .Label = c("A", "B", "C", 
"D", "E", "F"), class = "factor"), ROA = c(0, 5, 1, 3, 4, 2), 
    ROE = c(2, 3.8, 0, 1, 4, 5), ROI = c(3, 7, 2, 5, 6, 4)), .Names = c("Ticker", 
"ROA", "ROE", "ROI"), class = "data.frame", row.names = c(NA, 
-6L))

答案 1 :(得分:1)

我们可以将sweeprowSums

一起使用
m1 <- `dim<-`(as.numeric(All_Data[,standard[,"Label"]]), dim(All_Data[,-1]))

All_Data[,"Ticker"][!rowSums(!sweep( m1, 2, as.numeric(standard[,"Value"]), ">"))]
#[1] B E

注意:这里使用的数据类似于OP的帖子中的数据,只有最小的假设,除了&#34; ROIC&#34;是一个错误的&#34; ROI&#34;。

数据

standard <- structure(c("ROE", "ROA", "ROI", "3.0", "3.5", "3.8"),
 .Dim = c(3L, 
 2L), .Dimnames = list(NULL, c("Label", "Value")))

All_Data <- structure(c("A", "B", "C", "D", "E", "F", "0", "5", "1", "3", 
"4", "2", "2.0", "3.8", "0.0", "1.0", "4.0", "5.0", "3", "7", 
"2", "5", "6", "4"), .Dim = c(6L, 4L), .Dimnames = list(NULL, 
c("Ticker", "ROA", "ROE", "ROI")))