我有400多个物种名单。我还有两个单独的名称列表,它们存在于原始400中。我想要做的是根据两个较小的列表建立存在/不存在(1和0)数据帧。两个单独的列表是等级与其长度相等的因子(唯一的物种名称),因此这两个中的每一个都是不同的长度,并且都小于原始的400.
以下是这四个单独列表中的两个名称中的一些名称:
head(col.eff1)
[1] Agapostemon sericeus Agapostemon texanus Agapostemon virescens Andrena rudbeckiae Andrena simplex
[6] Anthophora terminalis
head(inhs.eff1)
[1] Agapostemon virescens Andrena carlini Andrena personata Andrena rudbeckiae Augochlora pura
[6] Augochlorella aurata
我已尝试以下方法获取名称
intersect(col.eff1,inhs.eff1) ## what names do both lists have in common
setdiff(col.eff1,inhs.eff1) ## what names does 1 have that 2 does not
setdiff(inhs.eff1,col.eff1) ## what names does 2 have that 1 does not
一旦我在执行代码之前对列表进行排序,这些都可以正常工作,但它只给出了我的名字。
但我需要制作一个单独的数据框,包含400行(rownames作为物种名称),以及两个列,用于集合和采样中的物种存在(inhs。和col。)。 **我也在四个不同的时间做这件事。 感谢任何帮助,谢谢!
答案 0 :(得分:1)
如果将因子转换为字符以创建字符串向量,这将使事情变得更容易。
首先将您的原始物种名称列表和其他单独物种列表转换为字符
originalSpecies <- c("dog", "cat", "mouse", "monkey", "bird")
as.character(as.list(originalSpecies))
listA <- c("dog", "cat", "orangutan")
listB <- c("monkey", "rat", "hippopotamus")
然后使用ifelse()
对1或0和%in%
的物种进行编码,以查看较小列表中的名称是否在原始列表中
> ifelse(listA %in% originalSpecies, 1, 0)
[1] 1 1 0
> ifelse(listB %in% originalSpecies, 1, 0)
[1] 1 0 0
答案 1 :(得分:1)
我也会像the_darkside那样使用%in%
,但采用不同的方法
首先是数据。
col.eff1 <-
c("Agapostemon sericeus", "Agapostemon texanus", "Agapostemon virescens",
"Andrena rudbeckiae", "Andrena simplex", "Anthophora terminalis")
inhs.eff1 <-
c("Agapostemon virescens", "Andrena carlini", "Andrena personata",
"Andrena rudbeckiae", "Augochlora pura", "Augochlorella aurata")
现在,要将所有名称放在一个向量中,请使用union
,而不是intersect
或setdiff
。然后,使用此结果和原始矢量创建data.frame
。
rn <- union(col.eff1, inhs.eff1)
dat <- data.frame(col.eff1 = as.integer(rn %in% col.eff1),
inhs.eff1 = as.integer(rn %in% inhs.eff1)
)
row.names(dat) <- rn
dat
# col.eff1 inhs.eff1
#Agapostemon sericeus 1 0
#Agapostemon texanus 1 0
#Agapostemon virescens 1 1
#Andrena rudbeckiae 1 1
#Andrena simplex 1 0
#Anthophora terminalis 1 0
#Andrena carlini 0 1
#Andrena personata 0 1
#Augochlora pura 0 1
#Augochlorella aurata 0 1