R 获取唯一元素的所有索引

R 获取唯一元素的所有索引,r,text-mining,data-processing,R,Text Mining,Data Processing,我有一个包含500000个条目的数据集。其中的每个条目都有一个userId和一个productId。我想获得与每个不同ProductID对应的所有用户ID。但是这个列表太大了,下面的方法对我都不管用,速度非常慢。有没有更快的解决办法 使用lappy:(问题:遍历每个uniqpid元素的整个rpid列表) 样本数据: orderedIndx <- list() for(j in 1:length(rpid)){ existing <- length(orderedInd

我有一个包含500000个条目的数据集。其中的每个条目都有一个userId和一个productId。我想获得与每个不同ProductID对应的所有用户ID。但是这个列表太大了,下面的方法对我都不管用,速度非常慢。有没有更快的解决办法

使用
lappy
:(问题:遍历每个uniqpid元素的整个rpid列表)

样本数据:

  orderedIndx <- list()
  for(j in 1:length(rpid)){
    existing <- length(orderedIndx[rpid[j]])
    orderedIndx[rpid[j]][existing + 1] <- j
  }
ruid[1:10]
# [1] "a3sgxh7auhu8gw" "a1d87f6zcve5nk" "abxlmwjixxain"  "a395borc6fgvxv" "a1uqrsclf8gw1t" "adt0srk1mgoeu" 
 [7] "a1sp2kvkfxxru1" "a3jrgqveqn31iq" "a1mzyo9tzk0bbi" "a21bt40vzccyt4"

rpid[1:10]
# [1] "b001e4kfg0" "b001e4kfg0" "b000lqoch0" "b000ua0qiq" "b006k2zz7k" "b006k2zz7k" "b006k2zz7k" "b006k2zz7k"
 [9] "b000e7l2r4" "b00171apva"
输出应如下所示:

b001e4kfg0 -> a3sgxh7auhu8gw, a1d87f6zcve5nk
b000lqoch0 -> abxlmwjixxain
b000ua0qiq -> a395borc6fgvxv
b006k2zz7k -> a1uqrsclf8gw1t, adt0srk1mgoeu, a1sp2kvkfxxru1, a3jrgqveqn31iq
b000e7l2r4 -> a1mzyo9tzk0bbi
b00171apva -> a21bt40vzccyt4

数据框中是否有整齐的数据?那你就可以这么做了

library(dplyr)

df %>%
  select(productId, userId) %>%
  distinct

数据框中是否有整齐的数据?那你就可以这么做了

library(dplyr)

df %>%
  select(productId, userId) %>%
  distinct

数据框中是否有整齐的数据?那你就可以这么做了

library(dplyr)

df %>%
  select(productId, userId) %>%
  distinct

数据框中是否有整齐的数据?那你就可以这么做了

library(dplyr)

df %>%
  select(productId, userId) %>%
  distinct

似乎您只是在寻找
split

split(seq_along(rpid), rpid)

似乎您只是在寻找
split

split(seq_along(rpid), rpid)

似乎您只是在寻找
split

split(seq_along(rpid), rpid)

似乎您只是在寻找
split

split(seq_along(rpid), rpid)

不确定您想要什么类型的输出,或者数据集中有多少行,但我建议使用3个版本,您可以选择自己喜欢的版本。第一个版本使用
dplyr
和字符值作为变量。如果您有数百万行,我预计这会很慢。第二个版本使用了
dplyr
,但使用了因子变量。我希望这比上一次快。第三个版本使用
数据。表
。我预计这将同样快,或比第二个版本快

library(dplyr)

ruid = 
c("a3sgxh7auhu8gw", "a1d87f6zcve5nk", "abxlmwjixxain",  "a395borc6fgvxv",
  "a1uqrsclf8gw1t", "adt0srk1mgoeu", "a1sp2kvkfxxru1", "a3jrgqveqn31iq",
  "a1mzyo9tzk0bbi", "a21bt40vzccyt4")

rpid =
c("b001e4kfg0", "b001e4kfg0", "b000lqoch0", "b000ua0qiq", "b006k2zz7k",
  "b006k2zz7k", "b006k2zz7k", "b006k2zz7k", "b000e7l2r4", "b00171apva")

### using dplyr and character values
dt = data.frame(rpid, ruid, stringsAsFactors = F)

dt %>%
  group_by(rpid) %>%
  do(data.frame(list_ruids = paste(c(.$ruid), collapse=", "))) %>%
  ungroup

#         rpid                                                    list_ruids
#        (chr)                                                         (chr)
# 1 b000e7l2r4                                                a1mzyo9tzk0bbi
# 2 b000lqoch0                                                 abxlmwjixxain
# 3 b000ua0qiq                                                a395borc6fgvxv
# 4 b00171apva                                                a21bt40vzccyt4
# 5 b001e4kfg0                                a3sgxh7auhu8gw, a1d87f6zcve5nk
# 6 b006k2zz7k a1uqrsclf8gw1t, adt0srk1mgoeu, a1sp2kvkfxxru1, a3jrgqveqn31iq


# ----------------------------------

### using dplyr and factor values
dt = data.frame(rpid, ruid, stringsAsFactors = T)

dt %>%
  group_by(rpid) %>%
  do(data.frame(list_ruids = paste(c(levels(dt$ruid)[.$ruid]), collapse=", "))) %>%
  ungroup

#         rpid                                                    list_ruids
#       (fctr)                                                         (chr)
# 1 b000e7l2r4                                                a1mzyo9tzk0bbi
# 2 b000lqoch0                                                 abxlmwjixxain
# 3 b000ua0qiq                                                a395borc6fgvxv
# 4 b00171apva                                                a21bt40vzccyt4
# 5 b001e4kfg0                                a3sgxh7auhu8gw, a1d87f6zcve5nk
# 6 b006k2zz7k a1uqrsclf8gw1t, adt0srk1mgoeu, a1sp2kvkfxxru1, a3jrgqveqn31iq


# -------------------------------------

library(data.table)

### using data.table
dt = data.table(rpid, ruid)

dt[, list(list_ruids = paste(c(ruid), collapse=", ")), by = rpid]

#          rpid                                                    list_ruids
# 1: b001e4kfg0                                a3sgxh7auhu8gw, a1d87f6zcve5nk
# 2: b000lqoch0                                                 abxlmwjixxain
# 3: b000ua0qiq                                                a395borc6fgvxv
# 4: b006k2zz7k a1uqrsclf8gw1t, adt0srk1mgoeu, a1sp2kvkfxxru1, a3jrgqveqn31iq
# 5: b000e7l2r4                                                a1mzyo9tzk0bbi
# 6: b00171apva                                                a21bt40vzccyt4

不确定您想要什么类型的输出,或者数据集中有多少行,但我建议使用3个版本,您可以选择自己喜欢的版本。第一个版本使用
dplyr
和字符值作为变量。如果您有数百万行,我预计这会很慢。第二个版本使用了
dplyr
,但使用了因子变量。我希望这比上一次快。第三个版本使用
数据。表
。我预计这将同样快,或比第二个版本快

library(dplyr)

ruid = 
c("a3sgxh7auhu8gw", "a1d87f6zcve5nk", "abxlmwjixxain",  "a395borc6fgvxv",
  "a1uqrsclf8gw1t", "adt0srk1mgoeu", "a1sp2kvkfxxru1", "a3jrgqveqn31iq",
  "a1mzyo9tzk0bbi", "a21bt40vzccyt4")

rpid =
c("b001e4kfg0", "b001e4kfg0", "b000lqoch0", "b000ua0qiq", "b006k2zz7k",
  "b006k2zz7k", "b006k2zz7k", "b006k2zz7k", "b000e7l2r4", "b00171apva")

### using dplyr and character values
dt = data.frame(rpid, ruid, stringsAsFactors = F)

dt %>%
  group_by(rpid) %>%
  do(data.frame(list_ruids = paste(c(.$ruid), collapse=", "))) %>%
  ungroup

#         rpid                                                    list_ruids
#        (chr)                                                         (chr)
# 1 b000e7l2r4                                                a1mzyo9tzk0bbi
# 2 b000lqoch0                                                 abxlmwjixxain
# 3 b000ua0qiq                                                a395borc6fgvxv
# 4 b00171apva                                                a21bt40vzccyt4
# 5 b001e4kfg0                                a3sgxh7auhu8gw, a1d87f6zcve5nk
# 6 b006k2zz7k a1uqrsclf8gw1t, adt0srk1mgoeu, a1sp2kvkfxxru1, a3jrgqveqn31iq


# ----------------------------------

### using dplyr and factor values
dt = data.frame(rpid, ruid, stringsAsFactors = T)

dt %>%
  group_by(rpid) %>%
  do(data.frame(list_ruids = paste(c(levels(dt$ruid)[.$ruid]), collapse=", "))) %>%
  ungroup

#         rpid                                                    list_ruids
#       (fctr)                                                         (chr)
# 1 b000e7l2r4                                                a1mzyo9tzk0bbi
# 2 b000lqoch0                                                 abxlmwjixxain
# 3 b000ua0qiq                                                a395borc6fgvxv
# 4 b00171apva                                                a21bt40vzccyt4
# 5 b001e4kfg0                                a3sgxh7auhu8gw, a1d87f6zcve5nk
# 6 b006k2zz7k a1uqrsclf8gw1t, adt0srk1mgoeu, a1sp2kvkfxxru1, a3jrgqveqn31iq


# -------------------------------------

library(data.table)

### using data.table
dt = data.table(rpid, ruid)

dt[, list(list_ruids = paste(c(ruid), collapse=", ")), by = rpid]

#          rpid                                                    list_ruids
# 1: b001e4kfg0                                a3sgxh7auhu8gw, a1d87f6zcve5nk
# 2: b000lqoch0                                                 abxlmwjixxain
# 3: b000ua0qiq                                                a395borc6fgvxv
# 4: b006k2zz7k a1uqrsclf8gw1t, adt0srk1mgoeu, a1sp2kvkfxxru1, a3jrgqveqn31iq
# 5: b000e7l2r4                                                a1mzyo9tzk0bbi
# 6: b00171apva                                                a21bt40vzccyt4

不确定您想要什么类型的输出,或者数据集中有多少行,但我建议使用3个版本,您可以选择自己喜欢的版本。第一个版本使用
dplyr
和字符值作为变量。如果您有数百万行,我预计这会很慢。第二个版本使用了
dplyr
,但使用了因子变量。我希望这比上一次快。第三个版本使用
数据。表
。我预计这将同样快,或比第二个版本快

library(dplyr)

ruid = 
c("a3sgxh7auhu8gw", "a1d87f6zcve5nk", "abxlmwjixxain",  "a395borc6fgvxv",
  "a1uqrsclf8gw1t", "adt0srk1mgoeu", "a1sp2kvkfxxru1", "a3jrgqveqn31iq",
  "a1mzyo9tzk0bbi", "a21bt40vzccyt4")

rpid =
c("b001e4kfg0", "b001e4kfg0", "b000lqoch0", "b000ua0qiq", "b006k2zz7k",
  "b006k2zz7k", "b006k2zz7k", "b006k2zz7k", "b000e7l2r4", "b00171apva")

### using dplyr and character values
dt = data.frame(rpid, ruid, stringsAsFactors = F)

dt %>%
  group_by(rpid) %>%
  do(data.frame(list_ruids = paste(c(.$ruid), collapse=", "))) %>%
  ungroup

#         rpid                                                    list_ruids
#        (chr)                                                         (chr)
# 1 b000e7l2r4                                                a1mzyo9tzk0bbi
# 2 b000lqoch0                                                 abxlmwjixxain
# 3 b000ua0qiq                                                a395borc6fgvxv
# 4 b00171apva                                                a21bt40vzccyt4
# 5 b001e4kfg0                                a3sgxh7auhu8gw, a1d87f6zcve5nk
# 6 b006k2zz7k a1uqrsclf8gw1t, adt0srk1mgoeu, a1sp2kvkfxxru1, a3jrgqveqn31iq


# ----------------------------------

### using dplyr and factor values
dt = data.frame(rpid, ruid, stringsAsFactors = T)

dt %>%
  group_by(rpid) %>%
  do(data.frame(list_ruids = paste(c(levels(dt$ruid)[.$ruid]), collapse=", "))) %>%
  ungroup

#         rpid                                                    list_ruids
#       (fctr)                                                         (chr)
# 1 b000e7l2r4                                                a1mzyo9tzk0bbi
# 2 b000lqoch0                                                 abxlmwjixxain
# 3 b000ua0qiq                                                a395borc6fgvxv
# 4 b00171apva                                                a21bt40vzccyt4
# 5 b001e4kfg0                                a3sgxh7auhu8gw, a1d87f6zcve5nk
# 6 b006k2zz7k a1uqrsclf8gw1t, adt0srk1mgoeu, a1sp2kvkfxxru1, a3jrgqveqn31iq


# -------------------------------------

library(data.table)

### using data.table
dt = data.table(rpid, ruid)

dt[, list(list_ruids = paste(c(ruid), collapse=", ")), by = rpid]

#          rpid                                                    list_ruids
# 1: b001e4kfg0                                a3sgxh7auhu8gw, a1d87f6zcve5nk
# 2: b000lqoch0                                                 abxlmwjixxain
# 3: b000ua0qiq                                                a395borc6fgvxv
# 4: b006k2zz7k a1uqrsclf8gw1t, adt0srk1mgoeu, a1sp2kvkfxxru1, a3jrgqveqn31iq
# 5: b000e7l2r4                                                a1mzyo9tzk0bbi
# 6: b00171apva                                                a21bt40vzccyt4

不确定您想要什么类型的输出,或者数据集中有多少行,但我建议使用3个版本,您可以选择自己喜欢的版本。第一个版本使用
dplyr
和字符值作为变量。如果您有数百万行,我预计这会很慢。第二个版本使用了
dplyr
,但使用了因子变量。我希望这比上一次快。第三个版本使用
数据。表
。我预计这将同样快,或比第二个版本快

library(dplyr)

ruid = 
c("a3sgxh7auhu8gw", "a1d87f6zcve5nk", "abxlmwjixxain",  "a395borc6fgvxv",
  "a1uqrsclf8gw1t", "adt0srk1mgoeu", "a1sp2kvkfxxru1", "a3jrgqveqn31iq",
  "a1mzyo9tzk0bbi", "a21bt40vzccyt4")

rpid =
c("b001e4kfg0", "b001e4kfg0", "b000lqoch0", "b000ua0qiq", "b006k2zz7k",
  "b006k2zz7k", "b006k2zz7k", "b006k2zz7k", "b000e7l2r4", "b00171apva")

### using dplyr and character values
dt = data.frame(rpid, ruid, stringsAsFactors = F)

dt %>%
  group_by(rpid) %>%
  do(data.frame(list_ruids = paste(c(.$ruid), collapse=", "))) %>%
  ungroup

#         rpid                                                    list_ruids
#        (chr)                                                         (chr)
# 1 b000e7l2r4                                                a1mzyo9tzk0bbi
# 2 b000lqoch0                                                 abxlmwjixxain
# 3 b000ua0qiq                                                a395borc6fgvxv
# 4 b00171apva                                                a21bt40vzccyt4
# 5 b001e4kfg0                                a3sgxh7auhu8gw, a1d87f6zcve5nk
# 6 b006k2zz7k a1uqrsclf8gw1t, adt0srk1mgoeu, a1sp2kvkfxxru1, a3jrgqveqn31iq


# ----------------------------------

### using dplyr and factor values
dt = data.frame(rpid, ruid, stringsAsFactors = T)

dt %>%
  group_by(rpid) %>%
  do(data.frame(list_ruids = paste(c(levels(dt$ruid)[.$ruid]), collapse=", "))) %>%
  ungroup

#         rpid                                                    list_ruids
#       (fctr)                                                         (chr)
# 1 b000e7l2r4                                                a1mzyo9tzk0bbi
# 2 b000lqoch0                                                 abxlmwjixxain
# 3 b000ua0qiq                                                a395borc6fgvxv
# 4 b00171apva                                                a21bt40vzccyt4
# 5 b001e4kfg0                                a3sgxh7auhu8gw, a1d87f6zcve5nk
# 6 b006k2zz7k a1uqrsclf8gw1t, adt0srk1mgoeu, a1sp2kvkfxxru1, a3jrgqveqn31iq


# -------------------------------------

library(data.table)

### using data.table
dt = data.table(rpid, ruid)

dt[, list(list_ruids = paste(c(ruid), collapse=", ")), by = rpid]

#          rpid                                                    list_ruids
# 1: b001e4kfg0                                a3sgxh7auhu8gw, a1d87f6zcve5nk
# 2: b000lqoch0                                                 abxlmwjixxain
# 3: b000ua0qiq                                                a395borc6fgvxv
# 4: b006k2zz7k a1uqrsclf8gw1t, adt0srk1mgoeu, a1sp2kvkfxxru1, a3jrgqveqn31iq
# 5: b000e7l2r4                                                a1mzyo9tzk0bbi
# 6: b00171apva                                                a21bt40vzccyt4

你能给我们看看数据集的样本和你想要的输出吗?从你的代码中我不清楚你想做什么。@Aaron是的,我正在添加一些样本数据。你能给我们看一个样本数据集和你想要的输出吗?从你的代码中我不清楚你想做什么。@Aaron是的,我正在添加一些样本数据。你能给我们看一个样本数据集和你想要的输出吗?从你的代码中我不清楚你想做什么。@Aaron是的,我正在添加一些样本数据。你能给我们看一个样本数据集和你想要的输出吗?从你的代码中我不清楚你想做什么。“亚伦,是的,我正在添加一些示例数据:”我会考虑最后一个。它工作得很好为什么是最后一个?:-)另外,我的假设是没有任何重复的行。您可以在开始时创建自己的检查(以删除重复项),然后再继续该过程。哦。我选择它是因为首先你说它可能比另一个更快,而且我喜欢data.table的语法。读起来容易些:PNice:我会考虑最后一个。它工作得很好为什么是最后一个?:-)另外,我的假设是没有任何重复的行。您可以在开始时创建自己的检查(以删除重复项),然后再继续该过程。哦。我选择它是因为首先你说它可能比另一个更快,而且我喜欢data.table的语法。读起来容易些:PNice:我会考虑最后一个。它工作得很好为什么是最后一个?:-)另外,我的假设是没有任何重复的行。您可以在开始时创建自己的检查(以删除重复项),然后再继续该过程。哦。我选择它是因为首先你说它可能比另一个更快,而且我喜欢data.table的语法。读起来容易些:PNice:我会考虑最后一个。它工作得很好为什么是最后一个?:-)另外,我的假设是没有任何重复的行。您可以在开始时创建自己的检查(以删除重复项),然后再继续该过程。哦。我选择它是因为首先你说它可能比另一个更快,而且我喜欢data.table的语法。它看起来更容易阅读:P