dplyr在R中的mutate函数 - 将列作为多个列连接添加

33

我在使用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'?

提前感谢您的任何帮助!

2个回答

42
你需要使用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


谢谢Paul的关注!我按照您的建议操作,使用您的代码确实可以运行,但是当我尝试对单词进行排序(我的意思是:paste(sort(name, region, division), sep = '_')))时,它就无法正常工作了(与我上面描述的错误相同)。 - Marta Karas
你必须仔细阅读sort的文档,sort以向量作为输入,并返回排序后的版本。你给它三个向量,这不是使用sort的正确方式。你想要做什么? - Paul Hiemstra
哦,好的,我明白了(感谢您的解释!)。 在我的实际情况中,我有一个具有3个列的数据集。 这3列代表来自一个动作集的3个动作。 我不再关心这3个动作的顺序,因此我想将它们转换为一个变量 - 该变量的值将保留这3个动作的名称,并且“sort”旨在不考虑顺序。 - Marta Karas
感谢所有的建议!目前我得到了以下结果:states.df.sorted <- as.data.frame(t(apply(states.df, 1, sort))) names(states.df.sorted) <- c("v1", "v2", "v3") new.column = mutate(states.df.sorted, concated_column = paste(v1, v2, v3, sep = '_')) - Marta Karas
3
或者将其链式排序:states.df.sorted <- states.df %.% arrange(name, region, division) %.% mutate(concated_column = paste(name, region, division, sep = '_'))。 (说明:此代码用于对数据框进行按列排序并在新列中将多个列的值组合为一个字符串,使用了管道操作符“%.%”和函数“arrange()”、“mutate()”以及字符串拼接函数“paste()”。) - Vincent

2

补充一下Paul的回答。如果你想对行进行排序,可以尝试使用order函数。以下是一个例子:

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

这里使用 order 函数对数据框 states.df 按照名称进行排序,然后按照地区和分区进行细分。


我使用了这个apply答案,允许通过变量名粘贴行来进行突变!非常感谢您让我走上了正确的道路!mutate(tbl, var = apply(.[, c('varA', 'varB')], 1, function(x) paste(x, collapse = ""))) - MS Berends

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接