2014-02-13 48 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, –