Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以使用R data.table连接功能来选择行并执行一些操作吗?_R_Join_Data.table - Fatal编程技术网

我可以使用R 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),

我不知道如何获得两个data.tables的联接所产生的行索引

为了建立一个简化的示例,假设dt是一个data.table,其列“a”是字母表中的一个字母,“b”是其他一些信息

我想添加一列“c”,并根据列“a”将其设置为“元音”或“辅音”。我有另一个数据表dtv,作为元音表。我可以使用data.table的连接功能有效地执行此操作吗

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.4
data.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