Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.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_List_Vector_Frequency_Frequency Analysis - Fatal编程技术网

基于R中向量中每个列表的公共第一个元素,组合列表向量中的所有元素

基于R中向量中每个列表的公共第一个元素,组合列表向量中的所有元素,r,list,vector,frequency,frequency-analysis,R,List,Vector,Frequency,Frequency Analysis,我有一个相当大的列表向量(大约300000行)。 例如,让我们考虑如下: vec = c( list(c("A",10,11,12)), list(c("B",10,11,15)), list(c("A",10,12,12,16)), list(c("A",11,12,16,17)) ) 现在,我想做以下工作: vec = c( list(c("A",10,11,12)), list(c("B",10,11,15)), list(c("A",10,12,12

我有一个相当大的列表向量(大约300000行)。 例如,让我们考虑如下:

vec = c( 
  list(c("A",10,11,12)), 
  list(c("B",10,11,15)),
  list(c("A",10,12,12,16)),
  list(c("A",11,12,16,17)) )
现在,我想做以下工作:

vec = c( 
  list(c("A",10,11,12)), 
  list(c("B",10,11,15)),
  list(c("A",10,12,12,16)),
  list(c("A",11,12,16,17)) )
对于向量中每个列表的每个唯一第一个元素,我需要向量中所有列表中与之对应的所有唯一元素,以及相应的频率

输出有点像:

对于
A
,我将使用频率分别为
2、2、4、2和1的元素
10、11、12、16和17
。对于
B
,它将是
10,11,15
,频率
1,1,1

多谢各位,
Ankur.

这里有一种方法

首先,创建列表的简单方法是:

L <- list(c("A", 10, 11, 12), 
          c("B", 10, 11, 15), 
          c("A", 10, 12, 12, 16), 
          c("A", 11, 12, 16, 17))

扩大到包含300000个相似大小元素的列表:

L <- replicate(300000, c(sample(LETTERS, 1), sample(100, sample(3:4, 1))))

system.time(
  freqs <- tapply(L, sapply(L, '[[', 1), function(x) 
    table(unlist(lapply(x, function(x) x[-1]))))
)

## user  system elapsed 
## 0.68    0.00    0.69 

如果只想将特定组的值制成表格,例如组
a
(以
a
开头的向量),则可以将上述结果子集:

L2 <- tapply(L, sapply(L, '[[', 1), function(x) 
  sort(table(unlist(lapply(x, function(x) x[-1]))), decreasing=TRUE), 
  simplify=FALSE)

L2$A

其中,
split
首先根据向量的第一个元素将
L
拆分为多个组,然后我们使用
$A
A
子集为一组

首先,创建列表的简单方法是:

L <- list(c("A", 10, 11, 12), 
          c("B", 10, 11, 15), 
          c("A", 10, 12, 12, 16), 
          c("A", 11, 12, 16, 17))

扩大到包含300000个相似大小元素的列表:

L <- replicate(300000, c(sample(LETTERS, 1), sample(100, sample(3:4, 1))))

system.time(
  freqs <- tapply(L, sapply(L, '[[', 1), function(x) 
    table(unlist(lapply(x, function(x) x[-1]))))
)

## user  system elapsed 
## 0.68    0.00    0.69 

如果只想将特定组的值制成表格,例如组
a
(以
a
开头的向量),则可以将上述结果子集:

L2 <- tapply(L, sapply(L, '[[', 1), function(x) 
  sort(table(unlist(lapply(x, function(x) x[-1]))), decreasing=TRUE), 
  simplify=FALSE)

L2$A

其中,
split
首先根据向量的第一个元素将
L
拆分为多个组,然后我们使用
$A
A
子集为组(1)请检查代码的括号;(2) 你有一个向量列表,或者一个向量向量,但没有一个列表向量;(3) 你说的300000行是什么意思?;(4) 您是否知道,如果将字符元素与数字元素组合在一个原子向量中,整个向量将强制为字符?;(5) 请尝试澄清你的文章标题。我刚刚编辑,因为我假设它是一个平面向量,缺少一个括号。如果向量确实嵌套得更深,请还原编辑。我已经安排了代码来显示简单的嵌套。(2)我有一个由“vec”定义的列表向量。(3) 我的代码中“vec”的长度是300000。但是,这里我们可以使用这个简短的示例。(4) 我知道强迫。让我们假设整个向量是字符@jbaumsThank@Spacedman。这正是我的意思。@mtoto
is.vector(c(list(1,2,3),list(4,5,6))
不同意您的意见。(1)请检查代码的括号;(2) 你有一个向量列表,或者一个向量向量,但没有一个列表向量;(3) 你说的300000行是什么意思?;(4) 您是否知道,如果将字符元素与数字元素组合在一个原子向量中,整个向量将强制为字符?;(5) 请尝试澄清你的文章标题。我刚刚编辑,因为我假设它是一个平面向量,缺少一个括号。如果向量确实嵌套得更深,请还原编辑。我已经安排了代码来显示简单的嵌套。(2)我有一个由“vec”定义的列表向量。(3) 我的代码中“vec”的长度是300000。但是,这里我们可以使用这个简短的示例。(4) 我知道强迫。让我们假设整个向量是字符@jbaumsThank@Spacedman。这正是我的意思。@mtoto
是.vector(c(list(1,2,3),list(4,5,6))
不同意你的观点。整洁,我唯一担心的解决方案可能是从300000个元素构造长向量(然后将其输入
)。它可能比从元素增量循环和构建表的方法慢。继续,将数据扩展到300000个元素,看看需要多长时间!(回答:在一个300000长的列表中,每个列表中约有10个元素,3秒钟!)谢谢@jbaums。如果我想根据频率的降序对内部列表进行排序怎么办?@James1991-你的意思是对结果列表的向量进行排序吗?-请看我的编辑。所以对于“A”,它将是:121011617,频率421@jbaumsGreat@杰鲍姆斯。另一方面。如果我只想得到向量中指定的一些值的结果列表,那么?例如,假设我有一个向量,里面有“a”。然后,我只需要输出列表中的$A。整洁,我唯一担心的解决方案可能是从300000个元素构造长向量(然后将其输入到
表中
)。它可能比从元素增量循环和构建表的方法慢。继续,将数据扩展到300000个元素,看看需要多长时间!(回答:在一个300000长的列表中,每个列表中约有10个元素,3秒钟!)谢谢@jbaums。如果我想根据频率的降序对内部列表进行排序怎么办?@James1991-你的意思是对结果列表的向量进行排序吗?-请看我的编辑。所以对于“A”,它将是:121011617,频率421@jbaumsGreat@杰鲍姆斯。另一方面。如果我只想得到向量中指定的一些值的结果列表,那么?例如,假设我有一个向量,里面有“a”。然后我只需要输出列表中的$A。