我可以使用R data.table连接功能来选择行并执行一些操作吗?
我不知道如何获得两个data.tables的联接所产生的行索引 为了建立一个简化的示例,假设dt是一个data.table,其列“a”是字母表中的一个字母,“b”是其他一些信息 我想添加一列“c”,并根据列“a”将其设置为“元音”或“辅音”。我有另一个数据表dtv,作为元音表。我可以使用data.table的连接功能有效地执行此操作吗我可以使用R data.table连接功能来选择行并执行一些操作吗?,r,join,data.table,R,Join,Data.table,我不知道如何获得两个data.tables的联接所产生的行索引 为了建立一个简化的示例,假设dt是一个data.table,其列“a”是字母表中的一个字母,“b”是其他一些信息 我想添加一列“c”,并根据列“a”将其设置为“元音”或“辅音”。我有另一个数据表dtv,作为元音表。我可以使用data.table的连接功能有效地执行此操作吗 require(data.table) dt <- data.table ( a = sample(letters, 25, replace = T),
require(data.table)
dt <- data.table ( a = sample(letters, 25, replace = T),
b = sample(50:100, 25, replace = F))
dtv <- data.table( vowel = c( 'a','e','i','o','u') )
setkey(dt,a)
但是如何获取行索引,以便将行标记为元音或辅音
dt[, c := 'consonant']
dt[{ `a` found in vowel list }, c := 'vowel']
# I want to do this where column 'a' is a vowel
实际上不需要使用合并/联接。我们可以在%中使用
%
dt[, c := "consonant"]
dt[a %in% dtv$vowel, c := "vowel"]
或者在同一行中使用相同的内容-
dt[, c := "consonant"][a %in% dtv$vowel, c := "vowel"]
或者(更好的是),我们可以在一个调用中使用以下命令执行这两个步骤
dt[, c := c("consonant", "vowel")[a %in% dtv$vowel + 1L]]
由于v1.9.4data.table
经过优化,在%
中的%上使用二进制联接,以防数据集已被键入。因此@Richards answer对于最新的数据应该具有相同的性能。table
版本(顺便说一句,%in%
在datatable.auto.index=TRUE
时使用时有一个bug,因此请确保您安装了数据。table
v 1.9.6+,如果您打算使用它)
下面是使用%
函数中的%时使用二进制联接的数据的图示
require(data.table)
set.seed(123)
dt <- data.table ( a = sample(letters, 25, replace = T),
b = sample(50:100, 25, replace = F))
dtv <- data.table( vowel = c( 'a','e','i','o','u') )
setkey(dt, a)
options(datatable.verbose = TRUE)
dt[a %in% dtv$vowel]
# Starting bmerge ...done in 0 secs <~~~ binary join was triggered
# a b
# 1: i 87
# 2: o 84
# 3: o 62
# 4: u 77
或者,如果您希望避免连接dtv
中不必要的列(如果存在),则只能连接到dtv
中的第一列
dt[dtv$vowel, c := 'consonant']
请注意,我没有使用()
或J()
<代码>数据。如果i
th元素不是integer
或numeric
类型,则默认情况下,表将执行二进制联接而不是行索引。例如,如果您希望对列b
(类型为integer
)执行二进制联接,则这很重要。比较
setkey(dt, b)
dt[80:85]
# a b <~~~ binary join wan't triggered, instead an attempt to subset by rows 80:85 was made
# 1: NA NA
# 2: NA NA
# 3: NA NA
# 4: NA NA
# 5: NA NA
# 6: NA NA
及
如果不希望data.table
过于冗长,请不要忘记设置选项(datatable.verbose=FALSE)
dt[dtv$vowel, c := 'consonant']
setkey(dt, b)
dt[80:85]
# a b <~~~ binary join wan't triggered, instead an attempt to subset by rows 80:85 was made
# 1: NA NA
# 2: NA NA
# 3: NA NA
# 4: NA NA
# 5: NA NA
# 6: NA NA
dt[.(80:85)] # or dt[J(80:85)]
# Starting bmerge ...done in 0 secs <~~~ binary join was triggered
# a b
# 1: x 80
# 2: x 81
# 3: NA 82
# 4: NA 83
# 5: o 84
# 6: NA 85
setkey(dt, a)
dt[a %in% dtv$vowel]
# Starting bmerge ...done in 0 secs
# a b
# 1: i 87
# 2: o 84
# 3: o 62
# 4: u 77
dt[dtv$vowel]
# Starting bmerge ...done in 0 secs
# a b
# 1: a NA <~~~ unmatched values returned
# 2: e NA <~~~ unmatched values returned
# 3: i 87
# 4: o 84
# 5: o 62
# 6: u 77
dt[dtv$vowel, nomatch = 0L]
# Starting bmerge ...done in 0 secs
# a b
# 1: i 87
# 2: o 84
# 3: o 62
# 4: u 77