R使用if else语句组合数据表

时间:2014-02-14 01:32:16

标签: r if-statement vectorization apply

我正在尝试对数据表的每一行执行比较,然后根据比较结果从另一个表中提取一行。如果要查找的索引大于查找表的长度,则需要执行计算。这就是我所拥有的。我迭代的表是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常常让我对它的迭代和向量操作感到困惑。

1 个答案:

答案 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

基本想法是使用LoadingsIndicatorsIndicators$Val.A合并到Loading$Index,并保留Indicators中的所有列。如果没有匹配,结果中的Zone.A - Zone.E将为NA。所以现在我们只选择那些Zone.A=NA的行并使用你的第二条规则填充。

这假设Loadings在Index上排序(所以最后一行有max(Index))。