R:从列表到记录重新分配条款?

时间:2012-06-06 17:53:54

标签: r list vector

我从数据列表的一列中提取了术语。现在这些术语都在一个非结构化的列表中(或者它是一个向量?我不知道如何告诉它。)。 这就是现在的开头:

> data$C1  
 [1] "GERMANY"         "GERMANY"         "GERMANY"         "GERMANY"        "FRANCE"         "FRANCE"          "GERMANY"        "ITALY"  

为了进一步分析,我想将这些术语重新分配给我最初从中提取数据列表的记录。 在我的例子中,第一个记录包含三个术语,第二个记录,第三个记录和第四个记录,等等。所以这将是正确的输出:

> data$C1  
 [1] "GERMANY"        "GERMANY"         "GERMANY"  
 [2] "GERMANY"  
 [3] "FRANCE"         "FRANCE"  
 [4] "GERMANY"        "ITALY"  

这就是我如何计算每条记录中的术语数量:

> count <- sapply(data$C1, length)  
> count  
 [1] 3 1 2 2  

这就是我可以观察到第八个词属于第四个记录,例如:

> number <- rep(1:length(count), count)  
> number  
 [1]   1   1   1   2   3   3   4   4  
> number[8]  
 [1] 4  

但是如何使用这些语句来实现所需的输出? 再一次:我想将前三个术语分配到第一个记录,下一个术语(第四个整体)分配给第二个记录,接下来的两个(列表中的第五个和第六个)到第三个记录,第七和第八至第四记录等 怎么办呢?

非常感谢你!

修改
我将许多制表符分隔的文本文件导入到R中,这将它们转换为一个大数据列表。共有55列(其中一列是数据$ C1。),每个文本文件最多有501行(标题加500条记录)。 data $ C1包含地址字符串。我将这些分成单个地址并从中提取国家名称。为了使原始列和非结构化列表之间的区别更加清晰,我重命名了它们。

> data$C1 #original before extraction (each line is a new record)  
 [1] "UNIV POTSDAM,DEPT PHYS,D-14415 POTSDAM,GERMANY; UNIV OLDENBURG,DEPT CHEM,D-26111 OLDENBURG,GERMANY; TECH UNIV CAROLO WILHELMINA BRAUNSCHWEIG,INST ORGAN CHEM,D-38106 BRAUNSCHWEIG,GERMANY"  
 [2] "TECH UNIV BERLIN,FACHBEREICH MATH,D-10623 BERLIN,GERMANY"  
 [3] "UNIV GRENOBLE 1,F-38041 GRENOBLE,FRANCE; UNIV PARIS 06,PARIS,FRANCE"  
 [4] "UNIV AUGSBURG, FACHBEREICH PHYS, D-86135 AUGSBURG, GERMANY; JOINT RES CTR ISPRA, MARINE ENVIRONM UNIT, I-21020 ISPRA, ITALY"  
 ...  

这是提取的术语的当前输出:

  

庆大霉素C1a
       [1]“德国”“德国”“德国”“德国”“法国”“法国”“德国”“意大利”
      ......

这是我正在寻找的正确输出:

> C1a #extracted terms  
 [1] "GERMANY"        "GERMANY"         "GERMANY"  
 [2] "GERMANY"  
 [3] "FRANCE"         "FRANCE"  
 [4] "GERMANY"        "ITALY"  
 ...  

这八个元素只是数据列表开头/顶部的一个示例。它的四个记录包含八个提取的术语:

> tapply(C1a, number, c)  
 Error in tapply(data$C1, number, c) : all arguments must have the same length  
> length(number)  
 [1] 4  
> length(data$C1)  
 [1] 4  
> length(C1a)  
 [1] 8  

是否可以使用其他列之一来重新分配条款?它是数据$ UT(唯一文章标识符),每条记录都有一个唯一的记录。值的示例是:

WOS:000300676300055  
WOS:A1995QQ99100006  

请问有谁能帮助我达到正确的输出吗?

1 个答案:

答案 0 :(得分:1)

我建议:

tapply(data$C1,number,c)

获得的结果:

$`1`
[1] "GERMANY" "GERMANY" "GERMANY"

$`2`
[1] "GERMANY"

$`3`
[1] "FRANCE" "FRANCE"

$`4`
[1] "GERMANY" "ITALY"  

这会将连接(c)函数应用于data$C1中共享公共值number的元素。结果是一个列表,所以使用双括号来引用它的元素(即[[1]],[[2]],[[3]],[[4]])。

希望这会有所帮助:)