我正在尝试对数据表的每一行执行比较,然后根据比较结果从另一个表中提取一行。如果要查找的索引大于查找表的长度,则需要执行计算。这就是我所拥有的。我迭代的表是Indicators
,看起来像下面的
Row, Val.A, Val.B
1, 30, 20.0
2, 3, 40.0
3, 1, 100.0
...
我正在查找的行是Loading
,看起来像这样:
Index, Zone.A, Zone.B, Zone.C, Zone.D, Zone.E
1, 10.0, 20.0, 1.00, 23.0, 34.5
2, 20.0, 40.0, 10.0, 34.5, 54.0
3, 40.0, 100.0, 100.0, 67.8, 98.2
...
10, 10.0, 10.0, 10.0, 10.0, 10.0
我要做的是使用ifelse()
或apply()
来解决此问题,但它无效。目标是在Loading
表中查找与Val.A
表中Indicators
的值对应的行,并在Loading
中没有数据时执行计算}。我试图使用的代码如下:
max.index <- max(Loading[,1])
result <- ifelse(Indicators$Val.A < max.index,
Loading[[Indicators$Val.A,2:6]],
Loading[[max.index,2:6]] * Indicators$Val.A
)
使用显示的数据Indicators
的目标结果为:
Zone.A, Zone.B, Zone.C, Zone.D, Zone.E
300.0, 300.0, 300.0, 300.0, 300.0
40.0, 100.0, 100.0, 67.8, 98.2
10.0, 20.0, 1.00, 23.0, 34.5
第一行位于Loading
表中可用行之外,因此计算它,但Indicators
的其他行包含Loading
表中包含的值,因此这些行只是抬起头来。感谢您的任何帮助,您可以提供。 R常常让我对它的迭代和向量操作感到困惑。
答案 0 :(得分:1)
这似乎有效:
z <- merge(Indicators,Loading,by.x="Val.A",by.y="Index",all.x=T)
z[is.na(z$Zone.A),4:8] <- Loading[nrow(Loading),2:6]*z[is.na(z$Zone.A),]$Val.A
z
# Val.A Row Val.B Zone.A Zone.B Zone.C Zone.D Zone.E
# 1 1 3 100 10 20 1 23.0 34.5
# 2 3 2 40 40 100 100 67.8 98.2
# 3 30 1 20 300 300 300 300.0 300.0
基本想法是使用Loadings
和Indicators
将Indicators$Val.A
合并到Loading$Index
,并保留Indicators
中的所有列。如果没有匹配,结果中的Zone.A - Zone.E
将为NA。所以现在我们只选择那些Zone.A=NA
的行并使用你的第二条规则填充。
这假设Loadings在Index上排序(所以最后一行有max(Index))。