2011-07-06 254 views
1

假設我有以下數據框。根據另一列的值創建一個新的數據框列

dat <- data.frame(city=c("Chelsea","Brent","Bremen","Olathe","Lenexa","Shawnee"), 
     tag=c(rep("AlabamaCity",3), rep("KansasCity",3))) 

我想包括第三列Tag2,它將是每個狀態來自標記列的區域。所以前三個城市最終將成爲'南部',最後三個將成爲'中西部'。數據看起來像。

 city   tag  tag2 
1 Chelsea AlabamaCity South 
2 Brent AlabamaCity South 
3 Bremen AlabamaCity South 
4 Olathe KansasCity Midwest 
5 Lenexa KansasCity Midwest 
6 Shawnee KansasCity Midwest 

我試過下面的命令,但它沒有創建一個新的列。 誰能告訴我什麼是錯的。

fixit <- function(dat) { 
    for (i in 1:nrow(dat)) { 
      Words = strsplit(as.character(dat[i, 'tag']), " ")[[1]] 
      if(any(Words == 'Alabama')) { 
       dat[i, 'tag2'] <- "South" 
      } 
      if(any(Words == 'Kansas')) { 
       dat[i, 'tag2'] <- "Midwest" 
      } 
    } 
    return(dat) 
} 

感謝您的幫助。

回答

3

它不工作,因爲你的strsplit()創建Words是錯誤的。 (你知道如何調試一個R函數的不好嗎?)

debug: Words = strsplit(as.character(dat[i, "tag"]), " ")[[1]] 
Browse[2]> 
debug: if (any(Words == "Alabama")) { 
    dat[i, "Tag2"] <- "South" 
} 
Browse[2]> Words 
[1] "AlabamaCity" 

在這一點上,Words肯定不等於"Alabama""Kansas",將來也不會,所以if()條款從未得到執行。 R 返回dat,它是你的功能不是改變dat

這會爲你做,而且更通用一些。首先創建一個數據幀保持匹配的單詞與所述區域

region <- data.frame(tag = c("Alabama","Kansas"), tag2 = c("South","Midwest"), 
        stringsAsFactors = FALSE) 

移到該數據幀的行的環路,匹配"tag" S和插入適當"tag2" S:

for(i in seq_len(nrow(region))) { 
    want <- grepl(region[i, "tag"], dat[, "tag"]) 
    dat[want, "tag2"] <- region[i, "tag2"] 
} 

,這將導致在此:

> dat 
    city   tag tag2 
1 Chelsea AlabamaCity South 
2 Brent AlabamaCity South 
3 Bremen AlabamaCity South 
4 Olathe KansasCity Midwest 
5 Lenexa KansasCity Midwest 
6 Shawnee KansasCity Midwest 

這是如何工作的?關鍵是grepl()。如果我們這樣做只是一場比賽,"Alabama"grepl()這樣使用:

grepl("Alabama", dat[, "tag"]) 

,並返回一個邏輯指示哪個"tag"元素的匹配字符串「亞拉巴馬」號:

> grepl("Alabama", dat[, "tag"]) 
[1] TRUE TRUE TRUE FALSE FALSE FALSE 
+0

我應該加;你的'strsplit()'失敗的原因是''tag''元素中沒有空格'''',因此這些字符串沒有被分割。你在某個地方犯了一個錯字嗎? –

+0

感謝您的幫助。我仍然不知道如何在R中進行調試,但我想我必須開始研究這個問題。 – ATMathew

+0

好的 - 最簡單的事情,我在這裏做的只是運行'debug(fixit)'然後'fixit(dat)',它會讓你進入調試器,你可以一次一行地執行代碼。 –

相關問題