比较另一个表中的一个元素和返回列

时间:2014-11-19 06:55:48

标签: r

嗨,我有一个非常棘手的问题。 我尝试了几种方法,到目前为止我迷路了。

我有一个包含一列的表,其中包含9和2。

这是第二张表:

> my_crazy_data
   V1 V2  V3  V4  V5  V6  V7
1   1  a 2.0 3.0 4.0 9.0 6.0
2   1  b 0.2 0.1 0.8 0.9 0.2
3   1  c 0.1 0.3 0.4 0.1 0.8
4   1  d 0.1 0.1 0.3 0.1 0.4
5   2  a 1.0 2.0 3.0 4.0 5.0
6   2  b 0.1 0.4 0.3 0.5 0.7
7   2  c 0.1 0.4 0.2 0.5 0.8
8   2  d 0.2 0.5 0.6 0.7 0.9
9   3  a 8.0 2.0 3.0 4.0 5.0
10  3  b 0.1 0.4 0.3 0.5 0.7
11  3  c 0.1 0.4 0.2 0.5 0.8
12  3  d 0.2 0.5 0.6 0.7 0.9

现在我想从第一个表中获取第一个元素(在本例中为9)并在第一行V3-V7中找到它,因为V1是索引。一旦我找到了9(在这种情况下是V6),我想用V1和V2返回索引V1 = 1的所有V6,结果看起来像:

1 a 9.0
1 b 0.9
1 c 0.1 
1 d 0.1 

然后继续从table1的第二个元素(在这种情况下为2)和相同的过程,但只在第一行中搜索第一个V1 = 2,所以我会在第5行搜索2,一旦我找到它 只输出索引V1 = 2的列,结果如下:

2 a 2.0
2 b 0.4
2 c 0.4
2 d 0.5 

我该怎么做?请帮忙 - 任何方法都可以。

谢谢你xx

1 个答案:

答案 0 :(得分:1)

以下是解决问题的一种方法:

d <- read.table(text='   V1 V2  V3  V4  V5  V6  V7
1   1  a 2.0 3.0 4.0 9.0 6.0
2   1  b 0.2 0.1 0.8 0.9 0.2
3   1  c 0.1 0.3 0.4 0.1 0.8
4   1  d 0.1 0.1 0.3 0.1 0.4
5   2  a 1.0 2.0 3.0 4.0 5.0
6   2  b 0.1 0.4 0.3 0.5 0.7
7   2  c 0.1 0.4 0.2 0.5 0.8
8   2  d 0.2 0.5 0.6 0.7 0.9
9   3  a 8.0 2.0 3.0 4.0 5.0
10  3  b 0.1 0.4 0.3 0.5 0.7
11  3  c 0.1 0.4 0.2 0.5 0.8
12  3  d 0.2 0.5 0.6 0.7 0.9', header=TRUE)

# Your vector of values to look up    
v <- c(9, 2, 4)

# Split the second table by V1    
d.split <- split(d, d$V1)

do.call(rbind,
        mapply(function(x, y) {
          setNames(x[, c(1:2, 2 + match(y, x[1, -(1:2)]))], 
                   c('V1', 'V2', 'val'))
          }, d.split, v, SIMPLIFY=FALSE)
)

#      V1 V2 val
# 1.1   1  a 9.0
# 1.2   1  b 0.9
# 1.3   1  c 0.1
# 1.4   1  d 0.1
# 2.5   2  a 2.0
# 2.6   2  b 0.4
# 2.7   2  c 0.4
# 2.8   2  d 0.5
# 3.9   3  a 4.0
# 3.10  3  b 0.5
# 3.11  3  c 0.5
# 3.12  3  d 0.7