2015-06-23 77 views
0

我有兩個CSV文件,工作字的最大發生R中的新列。它們的格式是這樣的:添加基於從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. 創建關鍵字列表
  3. 該關鍵字列表進行比較,以每個單獨CSV文件,以確定某個特定關鍵字的出現次數的最大數量,然後附加信息的關鍵字列表。

我已經完成了第一步。

我收到由R讀取事情矢量/因素/數據幀等迷茫......而「強迫名單」。例如,在上面給我的文件,這個詞的最大出現「狼吞虎嚥」應該是10(其值是文件1 3和10中的文件2)

所以基本上兩件事情需要發生。首先,我需要在「關鍵字」中創建一個列,其中包含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

你在過去的失敗條命令的原因是,您嘗試使用$操作上的向量。它僅適用於列表或數據框架(這是列表的特例)。

有關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