将行名称与因子级别

时间:2017-09-29 17:06:29

标签: r

我有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。)。 **我也在四个不同的时间做这件事。 感谢任何帮助,谢谢!

2 个答案:

答案 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,而不是intersectsetdiff。然后,使用此结果和原始矢量创建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