我有两个数据集,我需要的是我想通过从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中映射这两个数据集。
答案 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
所以,如果你有矩阵,第一种方法会很快。