【发布时间】:2019-04-01 09:44:34
【问题描述】:
我有 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 中不存在)。上面的代码有效,但处理数百万个条目似乎很愚蠢......
非常感谢!
【问题讨论】:
-
要明确一点:对于每个
site != 1,您需要将sp1列中的所有0s 替换为"na",对吧? -
顺便说一句,不要调用您的数据
table- 那是函数的名称。 -
@markus 在此示例中的
sp1列中,是的,但实际上还有更多。并感谢您的命名建议。