【问题标题】:R - Values from 2D tableR - 二维表中的值
【发布时间】:2014-07-23 21:46:36
【问题描述】:

我想从二维表中选择值,我拥有的(虚构的)数据是:

dat <- matrix(runif(50),nrow=10)
rownames(dat) <- 10:1
colnames(dat) <- 1:5
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

我想从第一个表中读取与“xx”和“yy”对应的值,并按定义的“zz”顺序保存。

我尝试了什么:

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.

提前感谢您的帮助。

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    使用您的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:您在制作可重现示例方面做得很好,谢谢。为了完整起见,当您偏离 R 的基本包时,习惯上包括 library(plyr)(对于 daply)。而且,因为有时人们不会一致地复制/粘贴,所以很多人在使用随机数生成器时也会在开头添加set.seed(1)(或一些整数)。有时查看数据结构的形成方式以及您所做的事情很有用他们。想法。)

    【讨论】:

      【解决方案2】:

      这样会快很多:

      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
      

      (正如所指出的,您可能没有很好地描述问题。如果我将行名分配给矩阵,我可以匹配这些行并在高效的单列中执行 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"))
      

      【讨论】:

      • 我意识到我没有很清楚地说明问题。无论如何,如果列名不同,那么我想我可以用特定的列名替换“xx”和“yy”。如果我在答案之上也需要“zz”值怎么办?例如,10 9 0.45576 0.2093
      • 你的意思是问如果你想将dat的colnames匹配到'yy'怎么办?如果是这样,我认为从如何使用行名的示例中答案是相当明显的。
      • 没有。订单w.r.t。 Z Z。就像我想在从表中获得的值之上拥有 zz 的值。
      • 我担心我太具体了。我需要一个例子,
      • 很好,@BondedDust,我总是忘记使用矩阵进行索引。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-12
      • 1970-01-01
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多