R - 2D表中的值

时间:2014-07-23 21:46:36

标签: r plyr

我想从2-D表中选择值,并且我得到的(虚拟)数据是:

dat <- matrix(runif(50),nrow=10)
rownames(dat) <- 10:1
colnames(dat) <- 1:5
dat

2D表是:

  

DAT

        1         2          3          4          5
10 0.93428302 0.2637368 0.91326265 0.20931505 0.25215862
9  0.01458229 0.1401547 0.25761699 0.08444877 0.04543594
8  0.98966030 0.4418174 0.78787133 0.36977319 0.85497134
7  0.54360750 0.4014348 0.48607126 0.08431677 0.95499422
6  0.39402458 0.6774917 0.07525122 0.80501739 0.34954356
5  0.74283503 0.6652231 0.45576364 0.52726500 0.49623084
4  0.44952924 0.7003085 0.98825235 0.46539233 0.23546417
3  0.32351304 0.5867900 0.65499386 0.53018068 0.45590061
2  0.63876290 0.5140422 0.79265134 0.63175354 0.28500796
1  0.01185476 0.1773445 0.55828598 0.43911265 0.18718190

我的另一套:

xx <- sample(1:10,10,replace=FALSE)
yy <- sample(1:5,10,replace=TRUE)
zz <- 10:1
n.dat <- cbind(xx,yy,zz)
n.dat <- as.data.frame(n.dat)

数据集看起来像:

   xx yy zz
1   5  3 10
2  10  4  9
3   1  3  8
4   8  5  7
5   7  2  6
6   6  1  5
7   2  4  4
8   9  2  3
9   3  5  2
10  4  1  1

我想从第一个表中读取与&#34; xx&#34;相对应的值。和&#34; yy&#34;并按顺序保存为&#34; zz&#34;是定义。

我尝试了什么:

library(plyr)
val <- daply(subset(n.dat,xx %in% n.dat$xx),"c",
                   function(x) {
                     d1=x$xx
                     d2=x$yy
                     res_tab_R["d1","d2"]           
                   } )

但是我没有得到我想要的东西,而是出错了。

我想要的值是:

   10       9     ....
  0.4558  0.2093  and so on.

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

使用您的datn.dat,我选择从简单的apply开始:

options(digits = 4)
apply(n.dat, 1, function(rr) dat[rr[1], rr[2]])
##        1       2       3       4       5       6       7       8       9      10 
##  0.07525 0.43911 0.91326 0.45590 0.70031 0.74284 0.08445 0.51404 0.85497 0.54361 

但是,我认为您可能希望$xx列引用行名而不是​​行号(谁使用数字作为行名乱序?)。请注意dat[1,]引用顶行,dat['10',]引用(注意数字/字符串差异)。就这样:

apply(n.dat, 1, function(rr) dat[as.character(rr[1]), rr[2]])
##       1      2      3      4      5      6      7      8      9     10 
##  0.4558 0.2093 0.5583 0.8550 0.4014 0.3940 0.6318 0.1402 0.4559 0.4495 

这看起来就像你在“我想要的值”之后所列出的那样,但现在我想知道$zz列应该做什么,因为进一步索引不会产生你想要的输出:

apply(n.dat, 1, function(rr) dat[rr[1], rr[2]])[n.dat$zz]
##       10       9       8       7       6       5       4       3       2       1 
##  0.54361 0.85497 0.51404 0.08445 0.74284 0.70031 0.45590 0.91326 0.43911 0.07525 
apply(n.dat, 1, function(rr) dat[as.character(rr[1]), rr[2]])[n.dat$zz]
##      10      9      8      7      6      5      4      3      2      1 
##  0.4495 0.4559 0.1402 0.6318 0.3940 0.4014 0.8550 0.5583 0.2093 0.4558 

也许你可以收集到你要求的答案。

(顺便说一句:你对同一个变量有两个分配,所以你的cbind()调用被覆盖并被忽略。这里没有必要。)

(顺便说一句#2:你做了一个可重复的例子,谢谢你。为了完整起见,每当你偏离基础包的时候,习惯上包括library(plyr)(对于daply) R.并且,由于有时人们不会一致地复制/粘贴,因此许多人在使用随机数生成器时也会在开头添加set.seed(1)(或某个整数)。有时候看看数据结构如何形成为以及你对他们的所作所为。思想。)

答案 1 :(得分:0)

这会快得多:

dat[ with(n.dat, cbind(xx,yy) )]
 [1] 0.07525122 0.43911265 0.91326265 0.45590061 0.70030850 0.74283503 0.08444877 0.51404220 0.85497134
[10] 0.54360750

(正如所指出的,你可能没有很好地描述问题。如果我将rownames分配给矩阵我可以匹配那些并在一个有效的oneliner中执行cbind策略:

 rownames(dat) <- 10:1
 dat[ with(n.dat, cbind(match(xx,rownames(dat)),yy) )]
 [1] 0.4557636 0.2093151 0.5582860 0.8549713 0.4014348 0.3940246 0.6317535 0.1401547 0.4559006 0.4495292

这就是应该发布示例的方式(使用dput的输出:

dat <-
structure(c(0.93428302, 0.01458229, 0.9896603, 0.5436075, 0.39402458, 
0.74283503, 0.44952924, 0.32351304, 0.6387629, 0.01185476, 0.2637368, 
0.1401547, 0.4418174, 0.4014348, 0.6774917, 0.6652231, 0.7003085, 
0.58679, 0.5140422, 0.1773445, 0.91326265, 0.25761699, 0.78787133, 
0.48607126, 0.07525122, 0.45576364, 0.98825235, 0.65499386, 0.79265134, 
0.55828598, 0.20931505, 0.08444877, 0.36977319, 0.08431677, 0.80501739, 
0.527265, 0.46539233, 0.53018068, 0.63175354, 0.43911265, 0.25215862, 
0.04543594, 0.85497134, 0.95499422, 0.34954356, 0.49623084, 0.23546417, 
0.45590061, 0.28500796, 0.1871819), .Dim = c(10L, 5L), .Dimnames = list(
    c("10", "9", "8", "7", "6", "5", "4", "3", "2", "1"), NULL))

n.dat <- 
structure(list(xx = c(5L, 10L, 1L, 8L, 7L, 6L, 2L, 9L, 3L, 4L
), yy = c(3L, 4L, 3L, 5L, 2L, 1L, 4L, 2L, 5L, 1L), zz = c(10L, 
9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L)), .Names = c("xx", "yy", 
"zz"), class = "data.frame", row.names = c("1", "2", "3", "4", 
"5", "6", "7", "8", "9", "10"))