![](/img/trans.png)
[英]In R how do I compare values in a row of a dataframe by a single value in the same row of another dataframe
[英]How do I assign value to a row in a dataframe based on another in r?
我正在查看被不同樣本捕獲的蝴蝶數據,我的問題是用於同一物種的``名稱''(數字)不一致。 每個物種都被分配了一個編號來識別它們。
我有兩個數據框,第一個是每個物種“ 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)
我還有一個第二個數據庫“ 種類列表 ”,用作參考,其中包含正確的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)的最大值不超過可用於選擇的行數,並且檢查了它搜索的所有值是否都在數據中。
如果有人可以提出更好的方法來完成我未成功嘗試做的事情,或者指出我要去哪里,我將不勝感激。
您可以將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
排序,因為這是執行聯接的列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.