如何基于两列中的值创建新变量

问题描述

我想基于两列的条件向数据框添加新列。

我有以下数据:

Animal.1 <- c("A","B","C","A" )
Animal.2 <- c("B","A","C")
df <- data.frame(Animal.1,Animal.2)

如果满足以下条件:

Animal.1 = A和Animal.2 = B 要么 Animal.1 = B和Animal.2 = A

我希望称为pair.code的新列等于1。

我希望每对动物id都使用不同的数字,但是如果在Animal.1和Animal.2或Animal.2和Animal.1中找到相同的动物id,则使用相同的数字。

最终数据应如下所示:

Animal.1 <- c("A","C")
pair.code <- c("1","1","2","3","2")


df <- data.frame(Animal.1,Animal.2)

解决方法

我们可以首先按行sort元素,然后使用match创建'pair.code'

m1 <- t(apply(df,1,sort))
v1 <- paste(m1[,1],m1[,2])
df$pair.code <- match(v1,unique(v1))
df$pair.code
#[1] 1 1 2 3 2
,

使用factor的解决方案:

df$pair.code <- as.numeric(factor(apply(df,function(x) paste0(sort(x),collapse=""))))

df
#>   Animal.1 Animal.2 pair.code
#> 1        A        B         1
#> 2        B        A         1
#> 3        C        A         2
#> 4        B        C         3
#> 5        A        C         2