2014-02-13 43 views
18

我在使用mutate{dplyr}函數時遇到問題,目的是爲數據框添加新列。我想要一個新的字段爲字符類型,並且由其他列(也是字符類型)的排序字的「concat」組成。例如,對於下面的數據幀:R中的dplyr突變 - 添加列作爲連續列

> library(datasets) 
> states.df <- data.frame(name = as.character(state.name), 
+       region = as.character(state.region), 
+       division = as.character(state.division)) 
> 
> head(states.df, 3) 
    name region   division 
1 Alabama South East South Central 
2 Alaska West   Pacific 
3 Arizona West   Mountain 

我想用下面的第一個元素得到一個新的列:

"Alamaba_East South Central_South" 

我嘗試這樣做:

mutate(states.df, 
    concated_column = paste0(sort(name, region, division), collapse="_")) 

但我收到錯誤:

Error in sort(1:50, c(2L, 4L, 4L, 2L, 4L, 4L, 1L, 2L, 2L, 2L, 4L, 4L, : 
    'decreasing' must be a length-1 logical vector. 
Did you intend to set 'partial'? 

提前感謝您的幫助!

回答

20

您需要使用sep =而不是collapse =,爲什麼要使用sort?我用paste而不是paste0

library(dplyr) 
states.df <- data.frame(name = as.character(state.name), 
         region = as.character(state.region), 
         division = as.character(state.division)) 
res = mutate(states.df, 
    concated_column = paste(name, region, division, sep = '_')) 

就分類而言,您不會正確使用sort。也許你想:

as.data.frame(lapply(states.df, sort)) 

此排序每一列,並創建一個新data.frame與那些列。

+0

謝謝保羅的關注!我遵循你的建議,它可以處理你的代碼,但是當我嘗試*排序*這些詞(我的意思是:粘貼(排序(名稱,區域,分區),sep ='_'))) 。 (在我的描述中與上面相同的錯誤)。 –

+0

您必須仔細閱讀'sort'的文檔,'sort'將一個向量作爲輸入,並返回排序後的版本。你餵它三個向量,這不是你應該如何使用排序。你想要做什麼? –

+0

哦,好的,我明白了(謝謝你的解釋!)。在我的真實情況下,我有一個包含3列的數據集。 3列代表來自一組*行動的3個行動。我不再關心這3個動作如何被採用的順序,所以我想將它們轉換成一個變量 - 這個變量的值將保留這3個動作的名稱,並且'sort'不打算處理這個命令。 –

2

加上保羅的答案。如果您想對行進行排序,您可以嘗試order。這裏有一個例子:

res1 <- mutate(states.df, 
      concated_column = apply(states.df[order(name, region, division), ], 1, 
            function(x) paste0(x, collapse = "_"))) 

這裏按名稱順序排序data.frame states.df,然後通過區域和部門打破了領帶

+0

我用這個'apply'回答允許mutate通過變量名稱粘貼行!非常感謝讓我走上正軌! (var,'varA','varB')],1,function(x)paste(x,collapse =「」)))'mutate(tbl, –