4

我正在尝试重新编号人群。

在数据中,“FamID”表示一个家庭,“PtID”表示与该家庭相关的个体患者。“双胞胎”列表示患者是同卵双胞胎(编码为 1)、异卵双胞胎(编码为 2)还是非双胞胎(编码为 0)。

  FamID    PtID    Twin    
  F1       F11     1
  F1       F12     1
  F2       F21     2
  F2       F22     2
  F3       F31     1
  F3       F32     1
  F4       F41     2 
  F5       F51     1  
  F5       F52     1 
  F5       F53     0
  F6       F61     1
  F6       F62     1
  F7       F71     2
  F7       F72     2

例如,“FamID”F1 有两个家庭成员,PtID F11 和 F12,他们是同卵双胞胎 (Twin = 1)。

我想创建一个具有基于 Twin 列和 FamID 列的编码的列 (NewCol)。

Twin 列中的第一组同卵双胞胎(编码为 1)在新列中将有 1,来自不同家庭的第二组同卵双胞胎将是 3,其中下一组同卵双胞胎将是下一个奇数号等。

对于异卵双胞胎(编码为 2s),它们的偶数会逐渐增加,第一个异卵双胞胎家族从 2 开始并上升。

任何非双胞胎(编码为 0),它们将保持为 0。

期望的输出:

  FamID   PtID     Twin     NewCol
  F1       F11     1        1
  F1       F12     1        1
  F2       F21     2        2
  F2       F22     2        2
  F3       F31     1        3
  F3       F32     1        3
  F4       F41     2        4
  F5       F51     1        5  
  F5       F52     1        5 
  F5       F53     0        0
  F6       F61     1        7
  F6       F62     1        7 
  F7       F71     2        6
  F7       F72     2        6

数据

 FamID <- c(rep("F1", 2), rep("F2", 2), rep("F3", 2), "F4", rep("F5", 3), rep("F6", 2), rep("F7", 2)) 
 PtID <- c("F11", "F12", "F21", "F22", "F31", "F32", "F41", "F51", "F52", "F53", "F61", "F62", "F71", "F72")
 Twin <- c(1, 1, 2, 2, 1, 1, 2, 1, 1, 0, 1, 1, 2, 2)
 sample <- data.frame(FamID, PtID, Twin)
4

2 回答 2

4

这是使用该data.table软件包的解决方案:

 dt <- data.table(sample)

 dt[Twin == 0, NewCol := 0L]
 dt[Twin == 1, NewCol := .GRP * 2L - 1L, by = FamID]
 dt[Twin == 2, NewCol := .GRP * 2L, by = FamID]

结果是

#      FamID PtID Twin NewCol
#  1:    F1  F11    1      1
#  2:    F1  F12    1      1
#  3:    F2  F21    2      2
#  4:    F2  F22    2      2
#  5:    F3  F31    1      3
#  6:    F3  F32    1      3
#  7:    F4  F41    2      4
#  8:    F5  F51    1      5
#  9:    F5  F52    1      5
# 10:    F5  F53    0      0
# 11:    F6  F61    1      7
# 12:    F6  F62    1      7
# 13:    F7  F71    2      6
# 14:    F7  F72    2      6

Data.tables 有几个好处(直观的语法,许多操作的效率)并且在与大多数函数一起使用时表现得与 data.frames 完全一样。但是,您可以使用转换回 data.frame

df <- as.data.frame(dt)
于 2013-05-16T23:17:14.097 回答
4

使用factors 和data.table

library(data.table)
DT.Sample <- data.table(sample)

DT.Sample[ , NewCol := 0]   

DT.Sample[Twin==1 , NewCol:= 2*as.numeric(factor(FamID))-1]
DT.Sample[Twin==2 , NewCol:= 2*as.numeric(factor(FamID))]

    FamID PtID Twin NewCol
 1:    F1  F11    1      1
 2:    F1  F12    1      1
 3:    F2  F21    2      2
 4:    F2  F22    2      2
 5:    F3  F31    1      3
 6:    F3  F32    1      3
 7:    F4  F41    2      4
 8:    F5  F51    1      5
 9:    F5  F52    1      5
10:    F5  F53    0      0
11:    F6  F61    1      7
12:    F6  F62    1      7
13:    F7  F71    2      6
14:    F7  F72    2      6
于 2013-05-16T23:19:02.870 回答