如何根据r中的另一个值为数据帧中的行赋值?

时间:2016-02-29 18:17:47

标签: r loops dataframe data-manipulation

我正在查看已经在不同样本中捕获的蝴蝶数据。我的问题是这些名称中存在不一致的情况。 (数字)用于同一物种。每个物种都被分配了一个数字来识别它们。

我有两个数据帧,第一个是每个物种的计数数据集" 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)

我有一个我用作参考的第二个数据库&#34; specieslist &#34;,这包含正确的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)

我想搜索 specieslist 以找出应该使用的号码 mydata ,并将正确的ID指定给 mydata 中的新列。

我一直在尝试创建一个循环,找出哪一行 specieslist 包含 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 mydata.corrsps 看起来像这样:

corr.sp <- c(10,3,3,20,1,23,20,2)
mydata.corrsps <- cbind(mydata,corr.sp)

这个演示代码似乎有效,但在我的一些实际数据中,当我运行循环说我的行索引( pos [1,1] )超出范围时,我会出现错误 - 我在搜索那些在该数据集中找不到的物种行之前就已经出现过这个错误了,但是我已经通过并删除了所有适用的行,将文件保存为csv并重新导入避免行索引混淆的错误(在r中进行子集化时似乎会发生数据)。我还检查了 pos(1,1)的最大值是否超过了可供选择的行数,我检查了它搜索的所有值都存在于数据中。

如果有人能提出一个更好的办法来做我未成功的事情,或者指出我哪里出错了,我将非常感激。

1 个答案:

答案 0 :(得分:0)

您可以设置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排序,因为这是执行连接的列。