使用R对数据帧中的列值进行条件替换

使用R对数据帧中的列值进行条件替换,r,replace,R,Replace,让我们创建一个虚拟数据集 ll = data.frame(rbind(c(2,3,5), c(3,4,6), c(9,4,9))) colnames(ll)<-c("b", "c", "a") > ll b c a 1 2 3 5 2 3 4 6 3 9 4 9 P = data.frame(cbind(c(3,5), c(4,6), c(8,7))) colnames(P)<-c("a", "b", "c") > P a b c 1 3 4 8 2 5 6 7

让我们创建一个虚拟数据集

ll = data.frame(rbind(c(2,3,5), c(3,4,6), c(9,4,9)))
colnames(ll)<-c("b", "c", "a")
> ll
  b c a
1 2 3 5
2 3 4 6
3 9 4 9

P = data.frame(cbind(c(3,5), c(4,6), c(8,7)))
colnames(P)<-c("a", "b", "c")
> P
  a b c
1 3 4 8
2 5 6 7
所以我试着这样做

nn=c("a", "b", "c")
new_ll = sapply(nn, function(i) 
  ll[,paste0(i)][ll[,paste0(i)] < P[,paste0(i)][1]] <- 0)

您可以在
ll
中找到小于
p
第一行的值,并使用
apply

t(apply(ll, 1, function(x) x<P[1,][colnames(ll)]))
      [,1] [,2]  [,3]
[1,]  TRUE TRUE FALSE
[2,]  TRUE TRUE FALSE
[3,] FALSE TRUE FALSE
TRUE
值显示要用0替换的位置:

ll[ ll < c(P[1, names(ll)]) ] <- 0
ll
  b c a
1 0 0 5
2 0 0 6
3 9 0 9

ll[ll您也可以尝试
mapply
,它将函数应用于每个对应的元素。这里,
ll
P
都是
data.frames
。因此,它对每个列应用该函数,并进行回收。在这里,我将
P
列名与
ll
的列名(类似于@Matthew Lundberg)进行匹配,并查找每列
ll
的哪些元素是

,如果您知道

ll
P
是数字的,您也可以这样做

llm <- as.matrix(ll)
pv <- as.numeric(P[1, colnames(llm)])  
llm[sweep(llm, 2, pv, `<=`)] <- 0
data.frame(llm)
#   b c a
# 1 0 0 5
# 2 0 0 6
# 3 9 0 9

llm谢谢,但是我的代码怎么了。。。我的意思是为什么sapply不工作?你的代码不工作,因为函数没有返回任何有用的东西。我认为这里不需要
apply
。你就不能做
ll[llll < c(P[1, names(ll)])
         b    c     a
[1,]  TRUE TRUE FALSE
[2,]  TRUE TRUE FALSE
[3,] FALSE TRUE FALSE
ll[ ll < c(P[1, names(ll)]) ] <- 0
ll
  b c a
1 0 0 5
2 0 0 6
3 9 0 9
do.call(cbind, lapply(names(ll), function(i) {
    ll[,i][ll[,i] < P[,i][1]] <- 0
    return(ll[i])}))
  b c a
1 0 0 5
2 0 0 6
3 9 0 9
indx <- mapply(`<`, ll, P[1,][names(ll)])
new_ll <- ll
new_ll[indx] <- 0
new_ll
 #  b c a
 #1 0 0 5
 #2 0 0 6
 #3 9 0 9
llm <- as.matrix(ll)
pv <- as.numeric(P[1, colnames(llm)])  
llm[sweep(llm, 2, pv, `<=`)] <- 0
data.frame(llm)
#   b c a
# 1 0 0 5
# 2 0 0 6
# 3 9 0 9