在没有for循环的情况下实现高效的基于条件的数据映射?
我有一个大于18 mil行的表(与多个对象相关的多个事件),我正在尝试创建一个映射列,以确定一个对象是否具有相同的事件发生序列 示例数据框(使用data.table提高效率):在没有for循环的情况下实现高效的基于条件的数据映射?,r,data.table,R,Data.table,我有一个大于18 mil行的表(与多个对象相关的多个事件),我正在尝试创建一个映射列,以确定一个对象是否具有相同的事件发生序列 示例数据框(使用data.table提高效率): aa基于数据表的解决方案。这样做的目的是计算每个id和val的行号,然后检查该行号是否与每个id的总行号相同 library(data.table) aa[, Count := .N, by = .(id, val)][ , noswitch := Count == .N, by = id][ , Coun
aa基于数据表的解决方案。这样做的目的是计算每个id
和val
的行号,然后检查该行号是否与每个id
的总行号相同
library(data.table)
aa[, Count := .N, by = .(id, val)][
, noswitch := Count == .N, by = id][
, Count := NULL][]
# id val noswitch
# 1: 1 a FALSE
# 2: 1 a FALSE
# 3: 1 b FALSE
# 4: 1 a FALSE
# 5: 4 c TRUE
# 6: 4 c TRUE
# 7: 4 c TRUE
# 8: 5 a FALSE
# 9: 5 b FALSE
# 10: 5 c FALSE
# 11: 5 a FALSE
# 12: 5 b FALSE
您还可以利用data.table::uniqueN
library(data.table)
dt[, noswitch := uniqueN(val) == .N, id]
我发现这个解决方案更容易阅读,但请注意它没有第一个解决方案快。这是一个很好的解决方案,执行时间是几秒钟,而不是几天!太神了非常感谢。
library(data.table)
aa[, Count := .N, by = .(id, val)][
, noswitch := Count == .N, by = id][
, Count := NULL][]
# id val noswitch
# 1: 1 a FALSE
# 2: 1 a FALSE
# 3: 1 b FALSE
# 4: 1 a FALSE
# 5: 4 c TRUE
# 6: 4 c TRUE
# 7: 4 c TRUE
# 8: 5 a FALSE
# 9: 5 b FALSE
# 10: 5 c FALSE
# 11: 5 a FALSE
# 12: 5 b FALSE
library(data.table)
dt[, noswitch := uniqueN(val) == .N, id]