如何替换R中其他数据集的值?

时间:2015-05-23 07:11:12

标签: r

我有两个数据集,我需要的是我想通过从dataset2中取值来替换dataset1中的值

dataset1

V1  V2  V3  V4  V5  V6  V7  V8  V9  V10 V11 V12 V13 
13  13  15  15  13  15  15  14  13  15  15  14  16  
13  14  16  14  15  16  13  16  13  14  16  13  16
14  15  15  14  16  16  13  16  13  15  15  15  13
14  13  15  13  14  13  15  14  14  16  14  14  16  
13  14  16  13  15  14  16  15  14  13  14  15  14  
15  13  14  14  13  16  13  13  14  15  15  14  13

dataset2

V1 V2
13 1
14 2
15 3
16 4

所以我想用dataset2值替换dataset1

Expected output

dataset1

V1  V2  V3  V4  V5  V6  V7  V8  V9  V10 V11 V12 V13 
1   1   3   3   1   3   3   2   1   3   3   2   4   
1   2   4   2   3   4   1   4   1   2   4   1   4
2   3   3   2   4   4   1   4   1   4   4   3   1
2   1   3   1   2   1   3   2   2   4   2   2   4   
1   2   4   1   3   2   4   3   2   1   2   3   2   
3   1   2   2   1   4   1   1   2   3   3   2   1

尝试:

for(i in 1:6) {
  for(j in 1:13) {
    ifelse(
      dataset1[i,j] == 13,
      1,
      ifelse(
        dataset1[i,j]==14,
        2,
        ifelse(
          dataset1[i,j] == 15,
          3,
          4
    )))
}
}

但是我无法匹配这两个数据集。那么请帮助我如何在R中映射这两个数据集。

1 个答案:

答案 0 :(得分:4)

转换后{{1}尝试match(' d1' as'数据集1',' d2' as' dataset2') 1}}到d1或使用matrix

unlist

或者

d1[] <- d2$V2[match(as.matrix(d1), d2$V1)]
d1
#  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13
#1  1  1  3  3  1  3  3  2  1   3   3   2   4
#2  1  2  4  2  3  4  1  4  1   2   4   1   4
#3  2  3  3  2  4  4  1  4  1   3   3   3   1
#4  2  1  3  1  2  1  3  2  2   4   2   2   4
#5  1  2  4  1  3  2  4  3  2   1   2   3   2
#6  3  1  2  2  1  4  1  1  2   3   3   2   1

或者另一种方法是转换为&#39; factor&#39;然后根据&#39; d2&#39;设置级别。列

d1[] <- d2$V2[match(unlist(d1),d2$V1)]

对于大数据集,使用列式操作(未测试)可能是有效的

d1[] <- as.numeric(as.character(factor(unlist(d1), levels=d2$V1, labels=d2$V2)))

或使用 library(dplyr) d1 %>% mutate_each(funs(d2$V2[match(., d2$V1)]))

data.table

基准

 library(data.table)
 library(fastmatch) 
 setDT(d1)
 for(j in 1:ncol(d1)){
  set(d1, i=NULL, j=j, value= d2$V2[fmatch(d1[[j]], d2$V1)])
 }

将矩阵转换为data.table可能会降低基准速度

set.seed(24)
m1 <- matrix(sample(100:20000, 1000*1000, replace=TRUE), ncol=1000)

set.seed(28)
m2 <- cbind(sample(unique(c(m1))), sample(length(unique(c(m1)))) )
system.time(m1[] <- m2[,2][match(m1, m2[,1])])
#   user  system elapsed 
# 0.092   0.003   0.094 

所以,如果你有矩阵,第一种方法会很快。