如何用R中的字符串替换数据框中的值?

Art*_*ito 8 string replace r na

简短版本:如何使用在另一个数据框中找到的字符串替换数据框中的值?

更长版本:我是一名与许多蜜蜂一起工作的生物学家.我有一个拥有数千只蜜蜂的数据集.每行都有一个唯一的蜜蜂ID#以及有关该样本的所有相关信息(捕获数据,GPS位置等).尚未输入每只蜜蜂的物种信息,因为它们需要很长时间才能识别它们.在IDing时,我最终得到了数百只蜜蜂,所有相同的物种.我将这些输入到一个单独的数据框中.我正在尝试编写代码来更新原始数据文件的物种信息(家庭,属,种,性等),因为我是蜜蜂的ID.目前,在原始数据文件中,物种信息是空白的,在R中被解释为NA.我想让R找到所有唯一的蜜蜂ID#并填写物种信息,但我无法弄清楚如何用字符串替换NA值(例如"Andrenidae")

这是我想要做的一个简单的例子:

rawData<-data.frame(beeID=c(1:20),family=rep(NA,20))
speciesInfo<-data.frame(beeID=seq(1,20,3),family=rep("Andrenidae",7))

rawData[rawData$beeID == 4,"family"]  <- speciesInfo[speciesInfo$beeID == 4,"family"]
Run Code Online (Sandbox Code Playgroud)

所以,我正在替换我想要的东西,但是用一个数字而不是姓氏(一个字符串).我最终想要做的是写一个小循环来添加所有物种信息,例如:

for (i in speciesInfo$beeID){
  rawData[rawData$beeID == i,"family"]  <- speciesInfo[speciesInfo$beeID == i,"family"]
}
Run Code Online (Sandbox Code Playgroud)

提前感谢任何建议!

干杯,

扎克

编辑:

我只是注意到下面的前两个方法每次都会添加一个新列,如果我需要多次添加物种信息(这通常会这样做)会导致问题.例如:

rawData<-data.frame(beeID=c(1:20),family=rep(NA,20))
Andrenidae<-data.frame(beeID=seq(1,20,3),family=rep("Andrenidae",7))
Halictidae<-data.frame(beeID=seq(1,20,3)+1,family=rep("Halictidae",7))

# using join
library(plyr)
rawData <- join(rawData, Andrenidae, by = "beeID", type = "left")
rawData <- join(rawData, Halictidae, by = "beeID", type = "left")

# using merge
rawData <- merge(x=rawData,y=Andrenidae,by='beeID',all.x=T,all.y=F)
rawData <- merge(x=rawData,y=Halictidae,by='beeID',all.x=T,all.y=F)
Run Code Online (Sandbox Code Playgroud)

有没有办法折叠列,以便我有一个统一的数据框?或者更新rawData而不是每次添加新列的方法?提前致谢!

dig*_*All 2

您可以使用合并功能,例如:

rawData <- data.frame(beeID=c(1:20),family=rep(NA,20))
speciesInfo <- data.frame(beeID=seq(1,20,3),
                          family=c(rep('Halictidae',4), rep("Andrenidae",3)))

merged <- merge(x=rawData,y=speciesInfo,by='beeID',all.x=T,all.y=F)
merged$family.x <- NULL # remove the family.x column
names(merged) <- c('beeID','family') # rename the columns
Run Code Online (Sandbox Code Playgroud)

注意

无需rawData使用family列进行初始化。
合并功能会自动添加它,例如:

rawData <- data.frame(beeID=c(1:20))
speciesInfo <- data.frame(beeID=seq(1,20,3),
                          family=c(rep('Halictidae',4), rep("Andrenidae",3)))

merged <- merge(x=rawData,y=speciesInfo,by='beeID',all.x=T,all.y=F)

> merged
   beeID     family
1      1 Halictidae
2      2       <NA>
3      3       <NA>
4      4 Halictidae
5      5       <NA>
6      6       <NA>
7      7 Halictidae
8      8       <NA>
9      9       <NA>
10    10 Halictidae
11    11       <NA>
12    12       <NA>
13    13 Andrenidae
14    14       <NA>
15    15       <NA>
16    16 Andrenidae
17    17       <NA>
18    18       <NA>
19    19 Andrenidae
20    20       <NA>
Run Code Online (Sandbox Code Playgroud)