gpt4 book ai didi

r - 我可以使用 R data.table 连接功能来选择行并执行一些操作吗?

转载 作者:行者123 更新时间:2023-12-04 10:56:51 25 4
gpt4 key购买 nike

我不确定如何获得由两个 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)

下一行代码给了我一个带有元音的行的 data.table
dt[dtv, nomatch=0]  

但是如何获取行索引,以便将行标记为元音或辅音?
dt[, c := 'consonant']
dt[{ `a` found in vowel list }, c := 'vowel']
# I want to do this where column 'a' is a vowel

最佳答案

自 V 1.9.4 data.table优化为在 %in% 上使用二进制连接如果数据集已经被键入。所以@Richards 的回答应该与最新的 data.table 具有相同的性能版本(顺便说一句,%in% 在使用时有一个错误 datatable.auto.index = TRUE ,所以如果你要使用它,请确保你已经安装了 data.table v 1.9.6+)

下面是data.table的插图使用 %in% 时使用二元连接功能

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

无论哪种方式,您都快到了,您可以轻松修改 c加入时
dt[, c := 'consonant']
dt[dtv, c := 'vowel']

或者,如果您想避免加入来自 dtv 的不必要的列(如果它们存在)您只能加入 dtv 中的第一列
dt[dtv$vowel, c := 'consonant']

请注意,我没有使用 .()J() . data.tablei 的情况下,默认情况下将执行二进制连接而不是行索引第 th 个元素的类型不是 integernumeric .例如,如果您想对列 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


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

这两种方法的另一个区别是 %in%不会返回不匹配的实例,比较
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

对于这种特定情况,这无关紧要,因为 :=不会修改不匹配的值,但您可以使用 nomatch = 0L在其他情况下
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

不要忘记设置 options(datatable.verbose = FALSE)如果你不想要 data.table要这么冗长。

关于r - 我可以使用 R data.table 连接功能来选择行并执行一些操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34124928/

25 4 0