gpt4 book ai didi

r - 我可以在不使用 merge() 函数的情况下使用 data.table 执行此操作吗?

转载 作者:行者123 更新时间:2023-12-01 12:06:19 24 4
gpt4 key购买 nike

我处理非常庞大的数据集,我正在努力加快我的 R 代码。这是一个数据示例:

dt <- data.table(id = c(100,101,102,103, 104), sex = c("m","f","m","m","f"), 
value = c(32,14,32,03,03))

data look like this :
id sex value
1: 100 m 32
2: 101 f 14
3: 102 m 32
4: 103 m 3
5: 104 f 3

我想要的最终输出:

   value f.value m.value f   m
1: 3 1 1 1 1
2: 14 1 NA 1 NA
3: 32 NA 2 NA 2

我目前使用的代码:

dt_u <- unique(dt, by = c("id", "sex", "value"))
dt_u <- dt_u[, .(n = .N), keyby = .(value, sex)]
dt_u <- dcast(dt_u, value ~ sex, value.var = "n")
dt_t <- dt[, .(n = .N), keyby = .(value, sex)]
dt_t <- dcast(dt_t, value ~ sex, value.var = "n")
dt <- merge(dt_t, dt_u, by = "value", all = TRUE)

代码运行良好,问题是 dt_u 和 dt_t 的合并在 10GB 以上的数据上会花费很多时间。所以我的问题是:是否可以在不必“拆分”数据然后合并数据的情况下获得相同的最终输出?

此外,如果可能的话,我希望答案在 data.table 中,谢谢。

编辑:例子和解释。 ID代表一个人,这个人可以去同一个位置(值)不止一次。对于此示例,您可以说每个值代表一个不同的城市。

即:

dt <- data.table(value = c(21,21,21,21,21,40,1,22,1,1,22, 22, 49, 
49,21,21,1,1,1), id =
c(1000716624,1000722724,1000716624,1000746824,1001012024,
1002067324,1002743624,1002743645, 1002743636,
1002743423,1000716624,1000722724, 1000722724,1001012024,
1000716624,1000716624,1002743624,1002743624,1002743624), sex = c("f", "m",
"m", "m", "f", "f", "m", "f", "f", "m", "f", "m", "m", "f","f","f", "m",
"m", "m"))

输出:

 value   places_women   places_men  number_women   number_men
1: 1 1 5 1 2
2: 21 4 3 2 3
3: 22 2 1 2 1
4: 40 1 NA 1 NA
5: 49 1 1 1 1

最佳答案

这适用于第二个示例(基于对所需输出的逆向工程):

> dcast(dt, value ~ sex, value.var=list("value", "id"), fun=list(length, uniqueN), fill=NA)
value value.1_length_f value.1_length_m id_uniqueN_f id_uniqueN_m
1: 1 1 5 1 2
2: 21 4 3 2 3
3: 22 2 1 2 1
4: 40 1 NA 1 NA
5: 49 1 1 1 1

如果这对整个问题不起作用,则更明确地描述每列中应该进行的计算(以及示例中可能更自然的列名称)会有所帮助。

关于r - 我可以在不使用 merge() 函数的情况下使用 data.table 执行此操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56367537/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com