首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何根据r中的另一行为数据r中的行分配值?

如何根据r中的另一行为数据r中的行分配值?
EN

Stack Overflow用户
提问于 2016-02-29 18:17:47
回答 1查看 305关注 0票数 1

我正在查看有关蝴蝶的数据,它们在不同的samples.My问题中被捕捉到,对于同一物种使用的“名称”(数字)是不一致的。每个物种都被分配了一个数字来识别它们。

我有两个数据,第一个是每个物种"mydata“的计数数据集,但是其中的每个物种都被分配了多个ID,而不仅仅是一个正确的ID。因此,两个不同的数字可能指同一个物种,我需要确保我的名字是标准化的。

代码语言:javascript
运行
复制
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。

代码语言:javascript
运行
复制
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列中选择值。

代码语言:javascript
运行
复制
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的样子如下所示:

代码语言:javascript
运行
复制
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)的最大值不超过可供选择的行数,并且我检查了它搜索的所有值都在数据中。

如果有人能提出更好的方法来做我想做的事情,或者指出我做错了什么,我将非常感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-29 18:47:22

可以将splist设置为长格式,然后将相关列与mydata合并

代码语言:javascript
运行
复制
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排序,因为这是执行连接的列。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35706629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档