gpt4 book ai didi

R;对于 A 列中的每个级别,按照 C 列中的条件替换 B 列中的值

转载 作者:行者123 更新时间:2023-12-02 00:54:29 24 4
gpt4 key购买 nike

我有 N 个地点的物种观察列表。观察结果是存在、不存在或未知(1、0、'na')。我需要做的是,对于每个物种,满足条件:

对于每个 SITE,如果没有 1%in% SITE,则将所有 0 替换为“na”

我已经使用嵌套循环和列表管理了一个解决方法,但这似乎非常低效。列中有关匹配值的一些问题提供了更优雅的解决方案,但我无法将它们应用到更复杂的设置中。

这是一些虚拟数据:

x <- c(1,2,3,4,5,6,7,8,9,10)
site <- c(1,1,1,2,2,2,3,3,3,1)
sp1 <- factor(c(1,1,'na','na',0,0,'na','na','na',0))
sp2 <- factor(c(0,0,1,1,'na','na',0,1,'na','na'))
table <- cbind.data.frame(x,site,sp1,sp2)

我做了什么:

for (j in c(3:4)){
site.present <- unique(table$site[which(table[,j]==1)])
for (i in (1:length(table[,j]))) {
ifelse(!(table[i,2]%in%site.present),
ifelse(table[i,j]==0,table[i,j]<-'na',T),T)
}
}

在此示例中,[5,3] 和 [6,3] 应变为“na”而不是 0(因为对于 sp1,站点 2 中不存在)。上面的代码有效,但处理数百万条目似乎很愚蠢......

非常感谢!

最佳答案

使用 dplyrbase::replace。我们可以用 NA 替换任何零,其中在该站点中没有物种等于 1。

library(dplyr)
df <- table

df %>% mutate_all(~as.numeric(as.character(.))) %>%
group_by(site) %>%
#mutate(sp1_mod=replace(sp1,all(sp1!=1, na.rm = TRUE) & sp1==0,NA)) #for one column
mutate_at(vars('sp1','sp2'), list(~replace(.,all(.!=1, na.rm = TRUE) & .==0,NA)))

此外,我们可以使用 Select 助手之一,而不是在 vars 中一个一个地命名变量,请参阅 ?dplyr::select,例如我们可以使用 matches 来匹配任何以 sp 开头且以一个或更多数字开头的列名

mutate_at(vars(matches('sp\\d+')), list(~replace(.,any(.==1, na.rm = TRUE) & .==0,NA)))

关于R;对于 A 列中的每个级别,按照 C 列中的条件替换 B 列中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55452167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com