Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.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 求和值在两列中出现的次数_R_Data.table - Fatal编程技术网

R 求和值在两列中出现的次数

R 求和值在两列中出现的次数,r,data.table,R,Data.table,我有一个很大的数据集——大约3200万行。我有关于电话号码、电话来源和目的地的信息 对于每个电话号码,我想计算它作为起始或目的地出现的次数 示例数据表如下所示: library(data.table) dt <- data.table(Tel=seq(1,5,1), Origin=seq(1,5,1), Destination=seq(3,7,1)) Tel Origin Destination 1: 1 1 3 2: 2 2

我有一个很大的数据集——大约3200万行。我有关于电话号码、电话来源和目的地的信息

对于每个电话号码,我想计算它作为起始或目的地出现的次数

示例数据表如下所示:

library(data.table)
dt <- data.table(Tel=seq(1,5,1), Origin=seq(1,5,1), Destination=seq(3,7,1))

    Tel Origin Destination 
1:   1      1           3 
2:   2      2           4
3:   3      3           5 
4:   4      4           6 
5:   5      5           7 

其中N表示Tel=1出现1,Tel=2出现1,Tel=3,4和5各出现2次。

我们可以进行
熔化
匹配

dt[, N := melt(dt, id.var = "Tel")[, tabulate(match(value, Tel))]]

或者另一个选项是循环第2列和第3列,使用%
中的
%检查“Tel”中的值是否存在,然后使用
减少
+
获取每个“Tel”的逻辑元素之和,将(
:=
)值分配给“N”

dt[, N := Reduce(`+`, lapply(.SD, function(x) Tel %in% x)), .SDcols = 2:3]
dt
#   Tel Origin Destination N
#1:   1      1           3 1
#2:   2      2           4 1
#3:   3      3           5 2
#4:   4      4           6 2
#5:   5      5           7 2

我们可以进行
melt
match

dt[, N := melt(dt, id.var = "Tel")[, tabulate(match(value, Tel))]]

或者另一个选项是循环第2列和第3列,使用%
中的
%检查“Tel”中的值是否存在,然后使用
减少
+
获取每个“Tel”的逻辑元素之和,将(
:=
)值分配给“N”

dt[, N := Reduce(`+`, lapply(.SD, function(x) Tel %in% x)), .SDcols = 2:3]
dt
#   Tel Origin Destination N
#1:   1      1           3 1
#2:   2      2           4 1
#3:   3      3           5 2
#4:   4      4           6 2
#5:   5      5           7 2

第二个方法构造一个临时data.table,然后将其连接到原始数据。这比@akrun的要长,效率可能要低,但是可以看到它很有用

# get temporary data.table as the sum of origin and destination frequencies
temp <- setnames(data.table(table(unlist(dt[, .(Origin, Destination)], use.names=FALSE))),
                 c("Tel", "N"))
# turn the variables into integers (Tel is the name of the table above, and thus character)
temp <- temp[, lapply(temp, as.integer)]

第二个方法构造一个临时data.table,然后将其连接到原始数据。这比@akrun的要长,效率可能要低,但是可以看到它很有用

# get temporary data.table as the sum of origin and destination frequencies
temp <- setnames(data.table(table(unlist(dt[, .(Origin, Destination)], use.names=FALSE))),
                 c("Tel", "N"))
# turn the variables into integers (Tel is the name of the table above, and thus character)
temp <- temp[, lapply(temp, as.integer)]

请注意,不是<代码> > 循环,这本身就是问题,而是如何执行操作。也许你应该考虑使用图论,在这里用TrimH包(电话号码作为节点,调用有向边)。请注意,循环不是<代码>,这本身就是问题。但是,你应该如何执行这个操作。也许你应该考虑使用图论,用TrimH包(电话号码作为节点,调用有向边)。但是你的代码产生了以下结果,这是不正确的。我得到了前两个电话号码N=3和N=4,而不是应该的1。但我会再次检查。@RalucaGui我的代码给出了您在后更正中显示的预期输出,我的错误!代码运行平稳。谢谢但是您的代码产生了以下结果,这是不正确的。我得到了前两个电话号码N=3和N=4,而不是应该的1。但我会再次检查。@RalucaGui我的代码给出了您在后更正中显示的预期输出,我的错误!代码运行平稳。谢谢
setcolorder(dt, c("Tel", "Origin", "Destination", "N"))