我正在处理两个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
在我的计划中,我想做以下事情:
通过合并两个CSV文件中的值并仅保留唯一关键字来创建关键字列表
将该关键字列表与每个CSV文件进行比较,以确定给定关键字的最大出现次数,然后将该信息附加到关键字列表中。
我已经完成的第一步。
我对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)
答案 0 :(得分:0)
您的上一次命令失败的原因是您尝试在向量上使用$
运算符。它仅适用于列表或数据框(这是列表的特例)。
关于toupper
(以及R中的许多其他函数)的注释:它适用于向量,因此您不需要使用sapply
。 toupper(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