[英]R - replace values in data frame using lookup table
我最近在嘗試使用查找表替換數據幀或矩陣中的特定值時遇到了一些麻煩。
所以這代表要修改的original.data ...
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14
1 255 255 255 255 255 255 255 255 255 255 255 255 255 255
2 255 255 255 255 255 255 255 255 3 3 255 255 255 255
3 255 255 255 255 255 1 3 3 3 3 3 255 255 255
4 255 255 5 5 5 1 3 3 4 4 3 255 255 255
5 255 5 5 5 5 1 3 4 4 4 4 255 255 255
6 255 5 5 5 1 3 3 3 4 4 3 3 255 255
7 255 255 5 1 3 3 3 3 6 6 6 3 255 255
8 255 255 1 1 1 1 2 2 3 3 6 3 255 255
9 255 255 1 1 1 2 2 2 2 2 3 3 3 255
10 255 255 255 1 2 2 2 2 2 2 2 3 3 255
11 255 255 255 2 2 2 2 2 7 7 7 2 255 255
12 255 255 255 2 2 8 8 8 7 255 255 255 255 255
13 255 255 255 255 8 8 255 255 255 255 255 255 255 255
14 255 255 255 255 255 255 255 255 255 255 255 255 255 255
...,然后可能是lookup.table(行= 1:9,列1 =“ Sub”,列2 =“ Main”):
Sub Main
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 255 255
7 6 3
8 7 2
9 8 2
目的是比較例如original.data[11,11]
[7]與lookup.tabel[8,"Sub"]
[7]
...並使用lookup.table[8,"Main"]
[2]編寫一個新矩陣lookup.table[8,"Main"]
modified.data[11,11]
]。 直到現在,我想到的只是使用for循環和if語句,
for (i in 1:ncol(original.data)){
for (j in 1:nrow(lookup.table)){
if (original.data[i,i]==lookup.table[j,1]){
origingal.data[j,i]<-lookup.table[j,2]
}
}
}
這導致
Error in origingal.data[j, i] <- lookup.table[j, 2] :
object 'origingal.data' not found
但我無法弄清楚我在推理中的錯誤。
我希望得到一些提示。
謝謝
\\\\\\\\\\問題解決了
for (i in 1:ncol(original.data)){
for (j in 1:nrow(original.data)){
for (x in 1:nrow(lookup.table)){
if (original.data[j,i]==lookup.table[x,1]){
original.data[j,i]<-lookup.table[x,2]
}
}
}
}
...可行,但這是一種更快的方法:
for(i in 1:nrow(lookup.table)){
c<-lookup.table[b,2]
d<-lookup.table[b,3]
original.data_modified[original.data == c] <- d
}
你可以試試 :
# x the original.data (a matrix)
# y the lookup.table
x2 <- y[match(x, y[,1]),2]
dim(x2) <- dim(x)
table(x, x2)
x2
x 1 2 3 4 5 255
1 13 0 0 0 0 0
2 0 22 0 0 0 0
3 0 0 29 0 0 0
4 0 0 0 8 0 0
5 0 0 0 0 11 0
6 0 0 4 0 0 0
7 0 4 0 0 0 0
8 0 5 0 0 0 0
255 0 0 0 0 0 100
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.