簡體   English   中英

如何基於r中的另一行將值分配給數據框中的行?

[英]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.spmydata.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM