32

我在使用mutate{dplyr}函数以向数据框添加新列时遇到问题。我希望一个新列是字符类型,并且包含来自其他列的排序单词的“concat”(也是字符类型)。例如,对于以下数据框:

> 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'?

感谢您提前提供任何帮助!

4

2 回答 2

41

您需要使用sep =not 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使用这些列创建一个新列。

于 2014-02-13T11:15:01.333 回答
2

补充保罗的答案。如果要对行进行排序,可以尝试order。这是一个例子:

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

这里 order 按名称对 data.frame states.df 进行排序,然后按区域和划分打破平局

于 2016-09-29T14:33:01.760 回答