[英]R update zero values in a data frame using a lookup table using the column names for the lookup
我希望能夠使用替換值的查找表替換數據幀中的零值,其中每列的替換值不同。 相信下面的簡單示例解釋了問題和期望的結果。
# Dummy data frame
A <- seq(0,5,1)
B <- seq(5,0,-1)
C <- c(1,3,0,4,2,5)
dfr<-data.frame(A,B,C)
A B C
0 5 1
1 4 3
2 3 0
3 2 4
4 1 2
5 0 5
# Lookup table with replacement values
D <- c('A','B','C')
E <- c(0.5,0.04,0.003)
lku <- data.frame(D,E)
D E
A 0.500
B 0.040
C 0.003
# Desired answer
A B C
0.50 5.00 1.000
1.00 4.00 3.000
2.00 3.00 0.003
3.00 2.00 4.000
4.00 1.00 2.000
5.00 0.04 5.000
因此,如果在使用查找表時在列A中找到零,則將零替換為0.50,但對於列B,零替換為0.04,依此類推。 我不知道從哪一個開始,除了使用循環逐個遍歷列並指向查找表的相應行?
更新
我給循環解決方案一個嘗試無法使這工作 - 解釋為什么不會有幫助。
for(i in 1:3){
ifelse(dfr[ ,i] == 0, lku[i,2], dfr[ ,i])
}
使用Map
基本R選項
dfr[] <- Map(function(x, y) replace(x, x == 0, y), dfr,
lku$E[match(names(dfr), lku$D)])
# A B C
#1 0.5 5.00 1.000
#2 1.0 4.00 3.000
#3 2.0 3.00 0.003
#4 3.0 2.00 4.000
#5 4.0 1.00 2.000
#6 5.0 0.04 5.000
另一個base R
可能是:
sweep(dfr == 0, 2, t(lku[2]), "*") + dfr
A B C
1 0.5 5.00 1.000
2 1.0 4.00 3.000
3 2.0 3.00 0.003
4 3.0 2.00 4.000
5 4.0 1.00 2.000
6 5.0 0.04 5.000
base R
的選項
lku$E[col(dfr)] * (!dfr) + dfr
# A B C
#1 0.5 5.00 1.000
#2 1.0 4.00 3.000
#3 2.0 3.00 0.003
#4 3.0 2.00 4.000
#5 4.0 1.00 2.000
#6 5.0 0.04 5.000
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.