Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R使用查找表(使用用于查找的列名)更新数据帧中的零值_R - Fatal编程技术网

R使用查找表(使用用于查找的列名)更新数据帧中的零值

R使用查找表(使用用于查找的列名)更新数据帧中的零值,r,R,我希望能够使用替换值查找表替换数据帧中的零值,其中每个列的替换值不同。相信下面的简单示例能够解释问题和期望的结果 # 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 val

我希望能够使用替换值查找表替换数据帧中的零值,其中每个列的替换值不同。相信下面的简单示例能够解释问题和期望的结果

# 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

使用
Map

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

dfr[]另一种
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

我正要发帖:
dfr[]@markus是的..我一发帖就意识到
Map
在这里更好。我会选择
for(j in names(dfr))dfr[dfr[[j]==0,j]也是一个非常好的解决方案-我比Map更了解这个问题solution@Markm0705谢谢,应该更快,因为它不是循环的
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