2

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

> 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  

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

非常感谢您!

编辑:
我将许多制表符分隔的文本文件导入到 R 中,这将它们变成了一个大数据列表。有 55 列(其中之一是 data$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  

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

WOS:000300676300055  
WOS:A1995QQ99100006  

请问有人能帮我实现正确的输出吗?

4

1 回答 1

1

我建议:

tapply(data$C1,number,c)

获得的结果:

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

$`2`
[1] "GERMANY"

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

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

这会将 concatenate() 函数应用于具有共同值c的元素。结果是一个列表,所以使用双括号来引用它的元素(即[[1]]、[[2]]、[[3]]、[[4]])。data$C1number

希望这可以帮助 :)

于 2012-06-06T19:10:05.817 回答