【问题标题】:Compare data in two dataframe and isolate the result比较两个数据框中的数据并隔离结果
【发布时间】:2016-07-05 03:01:41
【问题描述】:

我有两个数据集,一个包含元素及其各自的值(数据框: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”。 这似乎很容易,但我不知道如何编码 我真的很感激任何帮助。 谢谢!

【问题讨论】:

  • 从外观上看,您有两个 matrix 对象。请注意您的所有值如何具有""'s。这意味着即使您的数字也存储为文本字符串 - 我认为您可能需要重新考虑您最初是如何制作数据的。

标签: r dataframe compare


【解决方案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 帖子中的数据相似,除了“ROIC”是“ROI”的拼写错误之外,假设很少。

数据

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")))

【讨论】:

    【解决方案2】:

    如果将比较后的值放入一个向量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 函数将&amp; 应用于三个向量,以确保一行中的每个元素都大于相应的值。

    数据:(假设此处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))
    

    【讨论】:

    • 嗨 Psidom,非常感谢。抱歉,我创建了这个示例,在我的真实案例中,有 60 多个变量和 20000 行,它不是一个矩阵,而是假设它实际上是一个数据框。你有处理这么多数据的解决方案吗?
    • 刚刚更新了答案。这应该对你有用,假设你的标准已经是一个数据框。我建议您编辑您的问题以反映您的数据是数据框,这样它就不会混淆将来遇到同样问题的其他人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 2019-03-29
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    相关资源
    最近更新 更多