R 基于其他两列映射新数据框列的最快方法

R 基于其他两列映射新数据框列的最快方法,r,R,我有一个数据框,看起来像这样: id|value 01| 100 01| 101 01| 300 #edited for case I originally left out 02| 300 03| 100 03| 101 04| 100 我想添加一个新列,查看id和分配给每个id的值 例如: 如果一个id的值为100和101,我将把它添加到类别a中。 如果id的值为300,我会将其添加到类别b中。 如果id只有一个值(100或101,而不是两者),则将其分配给类别c 结果: id|value

我有一个数据框,看起来像这样:

id|value
01| 100
01| 101
01| 300 #edited for case I originally left out
02| 300
03| 100
03| 101
04| 100
我想添加一个新列,查看id和分配给每个id的值

例如: 如果一个id的值为100和101,我将把它添加到类别a中。 如果id的值为300,我会将其添加到类别b中。 如果id只有一个值(100或101,而不是两者),则将其分配给类别c

结果:

id|value|category
01| 100 |  a
01| 101 |  a
01| 300 |  b #edited for case I originally left out
02| 300 |  b
03| 100 |  a
03| 101 |  a
04| 100 |  c

我知道我可以循环使用它并分配类别,但我的问题是是否有更快的矢量化方法?

有两个带有
数据的选项。表

我们可以得到每个'id'的元素数,即'100','101',并将它们相加。输出将是0、1或2,对应于不存在、单个元素或两者都存在。这可以转换为
因子
,并更改
标签
,使“a”为“2”,“b”为“0”,而“c”为“1”

library(data.table)
setDT(df2)[, indx:=sum(unique(value)==100)+sum(unique(value)==101), 
  id][, category:=factor(indx, levels=c(2,0,1), labels=letters[1:3]) ][,
   indx:=NULL][]
#    id value category
#1:  1   100        a
#2:  1   101        a
#3:  2   300        b
#4:  3   100        a
#5:  3   101        a
#6:  4   100        c
或者我们可以创建一个命名向量('v1'),并使用它作为索引来映射按'id'分组的字符元素(
toString(…)

v1 <- c('100, 101' = 'a', '300'='b', '100'= 'c', '101'='c')
setDT(df2)[, category := v1[toString(sort(unique(value)))], by=id][]
#    id value category
#1:  1   100        a
#2:  1   101        a
#3:  2   300        b
#4:  3   100        a
#5:  3   101        a
#6:  4   100        c
或者使用第二个选项

  v1 <- c('100, 101' = 'a', '100, 101, 300' = 'a', '300'='b',
            '100'= 'c', '101'='c')
  setDT(df3)[, category := v1[toString(sort(unique(value)))], 
                by=id][value==300, category := 'b'][]
  #   id value category
  #1:  1   100        a
  #2:  1   101        a
  #3:  1   300        b
  #4:  2   300        b
  #5:  3   100        a
  #6:  3   101        a
  #7:  4   100        c

v1谢谢,这些很好用。然而,我发现我的数据中有一些id属于多个类别。例如,id 1的值可以为100、101和300。然后,我希望值100和101的条目为a类,值300的条目映射为b类。我更新了原始问题中的表格。Thanks@badger0053我更新了解决方案。请检查是否有效。
  v1 <- c('100, 101' = 'a', '100, 101, 300' = 'a', '300'='b',
            '100'= 'c', '101'='c')
  setDT(df3)[, category := v1[toString(sort(unique(value)))], 
                by=id][value==300, category := 'b'][]
  #   id value category
  #1:  1   100        a
  #2:  1   101        a
  #3:  1   300        b
  #4:  2   300        b
  #5:  3   100        a
  #6:  3   101        a
  #7:  4   100        c
df2 <- structure(list(id = c(1L, 1L, 2L, 3L, 3L, 4L), value = c(100L, 
101L, 300L, 100L, 101L, 100L)), .Names = c("id", "value"), 
row.names = c(NA, -6L), class = "data.frame")

df3 <- structure(list(id = c(1L, 1L, 1L, 2L, 3L, 3L, 4L), 
value = c(100L, 101L, 300L, 300L, 100L, 101L, 100L)),
.Names = c("id", "value"), class = "data.frame",
 row.names = c(NA, -7L))