作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 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 中不存在)。上面的代码有效,但处理数百万条目似乎很愚蠢......
非常感谢!
最佳答案
使用 dplyr 和 base::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/
我是一名优秀的程序员,十分优秀!