我正在查看有关蝴蝶的数据,它们在不同的samples.My问题中被捕捉到,对于同一物种使用的“名称”(数字)是不一致的。每个物种都被分配了一个数字来识别它们。
我有两个数据,第一个是每个物种"mydata“的计数数据集,但是其中的每个物种都被分配了多个ID,而不仅仅是一个正确的ID。因此,两个不同的数字可能指同一个物种,我需要确保我的名字是标准化的。
IDs <- c(10,8,3,42,7,23,42,2)
sample1 <- c(0,0,2,0,3,0,0,2)
sample2 <- c(0,1,0,2,4,0,3,1)
sample3 <- c(0,1,1,0,2,0,3,1)
sample4 <- c(0,2,0,2,0,1,2,1)
sample5 <- c(3,1,0,0,1,0,0,1)
mydata <- cbind(IDs,sample1,sample2,sample3,sample4,sample5)
我有第二个数据库,我正在使用它作为引用,"specieslist",,这包含正确的ID,加上可能已经使用的所有其他ID。
ID1 <- c(10,34,20,2,7,38)
ID2 <- c(22,3,42,NA,6,23)
ID3 <- c(NA,8,NA,NA,1,NA)
correct.ID <- c(10,3,20,2,1,23)
specieslist <- cbind(ID1,ID2,ID3,correct.ID)
splist <- replace(specieslist,is.na(specieslist),0)
我想搜索物种列表,以找出mydata中应该使用的数字,并将正确的ID分配给mydata中的新列。
我一直在尝试创建一个循环,该循环将查找物种列表的哪一行包含mydata中的值,然后在该行的correctID列中选择值。
corr.sp <- c(NULL)
rws <- length(mydata[,1])
for(s in 1:rws){
dat <- as.character(mydata[s,1])
pos <- which(splist==dat, arr.ind=TRUE)
ind <- pos[1,1]
corr <- as.matrix(splist[ind,4])
corr.sp <- c(corr.sp,corr)
}
mydata.corrsps <- cbind(mydata,corr.sp)
我所期望的是,corr.sp和corr.sp的样子如下所示:
corr.sp <- c(10,3,3,20,1,23,20,2)
mydata.corrsps <- cbind(mydata,corr.sp)
这个演示代码似乎有效,但在我的一些真实数据中,当我运行循环时,我的一个错误就出现了,我说我的行索引(ups 1,1)超出了范围--我以前在它搜索数据集中没有找到的行时出现过这个错误,但是我已经遍历并删除了任何行,将文件保存为csv并重新导入它,以避免行索引混合-up的错误(在r中插入时似乎会与数据一起出现)。我还检查了pos(1,1)的最大值不超过可供选择的行数,并且我检查了它搜索的所有值都在数据中。
如果有人能提出更好的方法来做我想做的事情,或者指出我做错了什么,我将非常感激。
发布于 2016-02-29 18:47:22
可以将splist
设置为长格式,然后将相关列与mydata
合并
library(tidyr)
library(dplyr)
# splist to long format
long.splist <- data.frame(splist) %>% gather(key, IDs, ID1:ID3)
# merge
merge(mydata,long.splist[,c(3,1)])
# IDs sample1 sample2 sample3 sample4 sample5 correct.ID
#1 2 2 1 1 1 1 2
#2 3 2 0 1 0 0 3
#3 7 3 4 2 0 1 1
#4 8 0 1 1 2 1 3
#5 10 0 0 0 0 3 10
#6 23 0 0 0 1 0 23
#7 42 0 2 0 2 0 20
#8 42 0 3 3 2 0 20
结果由IDs
排序,因为这是执行连接的列。
https://stackoverflow.com/questions/35706629
复制相似问题