2016-12-07 126 views
1

下面是数据设置:获取价值

require(data.table) 
set.seed(42) 
pos_mat <- data.table(c1 = sample(1:1000), c2 = sample(1:1000), c3 = sample(1:1000)) 
data <- data.table(value = rnorm(1000), other_stuff = rnorm(1000)) 

表看起来是这样的:

> pos_mat 
    c1 c2 V3 
1: 915 849 990 
2: 937 63 439 
3: 286 819 699 
4: 828 538 887 
5: 640 498 831 

996: 118 793 783 
997: 777 670 617 
998: 579 195 643 
999: 351 728 221 
1000: 834 742 244 

和:

> data 
      value other_stuff 
    1: -0.6013830 0.617336710 
    2: -0.1358161 -0.004541141 
    3: -0.9872728 -0.091256360 
    4: 0.8319250 0.399959375 
    5: -0.7950595 0.588901657 

996: -0.3757455 0.264323016 
997: -1.0417354 -1.355822276 
998: 0.6976674 0.359071548 
999: -0.1444488 -1.708252839 
1000: 0.4985434 -0.635928277 

现在每个元素在pos_mat中响应数据中的行号。我会新建一个与pos_mat具有相同尺寸的data.table,但不是具有行数,而是保存来自数据的相应值。

I.e. pos_mat [1,。(c1)]的值为915.在数据[915,。(value)] = 0.1702369中,我希望将它存储在新对象中。

我觉得是这样的:

new <- pos_mat 
n <- nrow(pos_mat) 
for(i in n) new[i,] <- data[unlist(pos_mat[1,]), value] 

应该工作,但它一直告诉我的尺寸是错误的。

+1

是不是更清晰了吧? – Repmat

+0

如果你想保持相同的尺寸这应该工作'新< - cbind(data $ value [pos_mat $ c1],数据$ value [pos_mat $ c2],数据$ value [pos_mat $ c3])' –

+0

@EtienneMoerman我看到你的想法,我有100.000列...这将是一些typ'ing ... – Repmat

回答

2

使用较小的数据集

require(data.table) 
set.seed(42) 
pos_mat <- data.table(c1 = sample(1:10), c2 = sample(1:10), c3 = sample(1:10)) 
data <- data.table(value = rnorm(10), other_stuff = rnorm(10)) 

如果你想要一个data.table的解决方案,你可以使用set和更新pos_dat(或任何其它数据集)的地方,像

for (j in names(pos_mat)) set(pos_mat, j = j, value = data[pos_mat[[j]], value]) 
pos_mat 
#    c1   c2   c3 
# 1: 1.8951935 1.3201133 1.8951935 
# 2: 1.2146747 -1.7813084 -0.2842529 
# 3: -2.6564554 -0.1719174 -0.1719174 
# 4: -0.3066386 -0.2842529 -1.7813084 
# 5: -2.4404669 -2.6564554 0.6359504 
# 6: -0.1719174 1.8951935 -2.6564554 
# 7: 1.3201133 -2.4404669 1.2146747 
# 8: 0.6359504 0.6359504 1.3201133 
# 9: -0.2842529 -0.3066386 -0.3066386 
# 10: -1.7813084 1.2146747 -2.4404669 

或使用矩阵(使用新的pos_mat数据集)

res <- data[unlist(pos_mat), value] 
dim(res) <- dim(pos_mat) 
res 
#    [,1]  [,2]  [,3] 
# [1,] 1.8951935 1.3201133 1.8951935 
# [2,] 1.2146747 -1.7813084 -0.2842529 
# [3,] -2.6564554 -0.1719174 -0.1719174 
# [4,] -0.3066386 -0.2842529 -1.7813084 
# [5,] -2.4404669 -2.6564554 0.6359504 
# [6,] -0.1719174 1.8951935 -2.6564554 
# [7,] 1.3201133 -2.4404669 1.2146747 
# [8,] 0.6359504 0.6359504 1.3201133 
# [9,] -0.2842529 -0.3066386 -0.3066386 
# [10,] -1.7813084 1.2146747 -2.4404669 

两个应该是有效的,但data.table一个可能更多的内存效率

+0

这些都是很好的解决方案,根据我的真实数据第一种解决方案更快......但第二种解决方案工作得足够快或许简单一点)。 – Repmat