使用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