我想从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.
提前感谢您的帮助。
答案 0 :(得分:0)
使用您的dat
和n.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"))