根据CSV中单词的最大出现次数在R中添加新列

时间:2015-06-23 15:43:21

标签: r csv

我正在处理两个CSV文件。它们的格式如下:

File 1

able,2
gobble,3
highway,3
test,6
zoo,10

File 2

able,6
gobble,10
highway,3
speed,7
test,8
upper,3
zoo,10

在我的计划中,我想做以下事情:

  1. 通过合并两个CSV文件中的值并仅保留唯一关键字来创建关键字列表

  2. 将该关键字列表与每个CSV文件进行比较,以确定给定关键字的最大出现次数,然后将该信息附加到关键字列表中。

  3. 我已经完成的第一步。

    我对R读取的东西感到困惑,比如矢量/因子/数据帧等......以及“强制列表”。例如,在上面给出的文件中,单词“gobble”的最大出现次数应为10(文件1中的值为3,文件2中的值为10)

    所以基本上需要做两件事。首先,我需要在“关键字”中创建一个列,其中包含有关CSV文件中单词出现次数的信息。其次,我需要用最大值填充该列。

    这是我的代码:

    # Read in individual data sets
    keywordset1=as.character(read.csv("set1.csv",header=FALSE,sep=",")$V1)
    keywordset2=as.character(read.csv("set2.csv",header=FALSE,sep=",")$V1)
    exclude_list=as.character(read.csv("exclude.csv",header=FALSE,sep=",")$V1)
    
    # Sort, capitalize, and keep unique values from the two keyword sets
    keywords <- sapply(unique(sort(c(keywordset1, keywordset2))), toupper)
    
    # Keep keywords greater than 2 characters in length (basically exclude in at etc...)
    keywords <- keywords[nchar(keywords) > 2]
    
    # Keep keywords that are not in the exclude list
    keywords <- setdiff(keywords, sapply(exclude_list, toupper))
    
    # HERE IS WHERE I NEED HELP
    
    # Compare the read keyword list to the master keyword list
    # and keep the frequency column
    
    key1=read.csv("set1.csv",header=FALSE,sep=",")
    key1$V1=sapply(key1[[1]], toupper)
    keywords$V2=key1[which(keywords[[1]] %in% key1$V1),2]
    
    return(keywords)
    

1 个答案:

答案 0 :(得分:0)

您的上一次命令失败的原因是您尝试在向量上使用$运算符。它仅适用于列表或数据框(这是列表的特例)。

关于toupper(以及R中的许多其他函数)的注释:它适用于向量,因此您不需要使用sapplytoupper(c(keywordset1, keywordset2))完全没问题。

但我想提出一个完全不同的解决方案来解决你的问题。首先,我按如下方式创建数据:

keywords1 <- read.table(text="able,2
gobble,3
highway,3
test,6
zoo,10",sep=",",stringsAsFactors=FALSE)

keywords2 <- read.table(text="gobble,10
highway,3
speed,7
test,8
upper,3
zoo,10",sep=",",stringsAsFactors=FALSE)

请注意,我使用stringsAsFactors=FALSE。这可以防止read.table将字符转换为因子,因此以后无需再调用as.character

接下来的步骤是将两个表中的关键字列大写。与此同时,我将两个表放在一个列表中。这通常是简化R中计算的好方法,因为您可以使用lapply在所有列表元素上应用函数。然后我把两张桌子都放在一张桌子里。

keyword_list <- lapply(list(keywords1,keywords2),function(kw)
    transform(kw,V1=toupper(V1)))
keywords_all <- do.call(rbind,keyword_list)

下一步是按第二列中的数字按降序对数据框进行排序:

keywords_sorted <- keywords_all[order(keywords_all$V2,decreasing=TRUE),]

keywords_sorted如下所示:

        V1 V2
5      ZOO 10
6   GOBBLE 10
11     ZOO 10
9     TEST  8
8    SPEED  7
4     TEST  6
2   GOBBLE  3
3  HIGHWAY  3
7  HIGHWAY  3
10   UPPER  3
1     ABLE  2

正如您所注意到的,某些关键字只出现一次,对于那些出现两次的关键字,第一次出现就是您要保留的关键字。 R中有一个函数可用于精确提取这些元素:duplicated()(运行?duplicated以了解更多信息)。基本上,如果元素在向量中至少第二次出现,则函数返回TRUE。这些是你不想要的元素。要将TRUE转换为FALSE(反之亦然),请使用运算符!。所以下面给出了你想要的结果:

keep <- !duplicated(keywords_sorted$V1)
keywords_max <- keywords_sorted[keep,]

        V1 V2
5      ZOO 10
6   GOBBLE 10
9     TEST  8
8    SPEED  7
3  HIGHWAY  3
10   UPPER  3
1     ABLE  2