我有两个数据集,一个包含元素及其各自的值(数据框: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”。 这看起来很简单,但我不知道如何编码 我真的很感激任何帮助。 谢谢!
答案 0 :(得分:1)
如果您将比较值放入向量standard
,其向量与All_Data
列的顺序相同,那么我们可以使用Map
和Reduce
功能解决问题:
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)
我们可以将sweep
与rowSums
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")))