在2列变量中分配ID

时间:2017-05-23 16:34:10

标签: r unique recode

我有一个数据框,其中每个个体(行)每个变量有两个数据点。

示例数据:

df1 <- read.table(text = "IID L1.1 L1.2 L2.1 L2.2 
                        1  1  38V1 38V1 48V1 52V1
                        2  2  36V1 38V2 50V1 48Y1
                        3  3  37Y1 36V1 50V2 48V1
                        4  4  38V2 36V2 52V1 50V2",
  stringsAsFactor = FALSE, header = TRUE)

我在完整数据集中有比此更多的列,并且想要重新编码这些值以在两列中标记唯一标识符。我知道如何从先前的问题(Creating a unique IDHow to assign a unique ID number to each group of identical values in a column)获取标识符和重新标记单个列,但我不知道如何包含两列的信息,因为R标识并标记每列的因子。

最终,我希望上述数据看起来像这样:

(df2)
  IID L1.1 L1.2 L2.1 L2.2 
1  1   1    1    1    4
2  2   2    4    2    5
3  3   3    2    3    1
4  4   1    5    4    3

数字是什么并不重要,只要它们在两列中指示唯一值即可。我尝试根据以下输出创建一个函数:

unique(df1[,1:2]) 

但我正在努力,因为这仍然会查看每列的唯一条目,而不是两个。

2 个答案:

答案 0 :(得分:2)

像这样的东西会起作用......

pairs <- (ncol(df1)-1)/2
for(i in 1:pairs){
  refs <- unique(c(df1[,2*i],df1[,2*i+1]))
  df1[,2*i] <- match(df1[,2*i],refs)
  df1[,2*i+1] <- match(df1[,2*i+1],refs)
}

df1
  IID L1.1 L1.2 L2.1 L2.2
1   1    1    1    1    4
2   2    2    4    2    5
3   3    3    2    3    1
4   4    4    5    4    3

答案 1 :(得分:2)

您可以将其重新整形为长格式,分配组然后将其重新加宽:

library(data.table)

df_m <- melt(df, id.vars = "IID")
setDT(df_m)[, id := .GRP, by = .(gsub("(.*).","\\1", df_m$variable), value)]
dcast(df_m, IID ~ variable, value.var = "id")

#  IID L1.1 L1.2 L2.1 L2.2
#1   1    1    1    6    9
#2   2    2    4    7   10
#3   3    3    2    8    6
#4   4    1    5    9    8

这也应该可以轻松扩展到多组列。即如果你有L3.它也应该使用它。