我有一个数据框,其中每个个体(行)每个变量有两个数据点。
示例数据:
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 ID和How 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])
但我正在努力,因为这仍然会查看每列的唯一条目,而不是两个。
答案 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.
它也应该使用它。