R中的dplyr mutate - 添加列作为列的连接

Posted

技术标签:

【中文标题】R中的dplyr mutate - 添加列作为列的连接【英文标题】:dplyr mutate in R - add column as concat of columns 【发布时间】:2014-03-12 05:22:55 【问题描述】:

我在使用 mutatedplyr 函数以向数据框添加新列时遇到问题。我希望一个新列是字符类型,并且包含来自其他列的排序单词的“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'?

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

您需要使用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 = '_')))却没有。 (与我描述中的上述错误相同)。 你要仔细阅读sort的文档,sort接受一个向量作为输入,并返回排序后的版本。你给它三个向量,这不是你应该使用排序的方式。你到底想做什么? 哦,好的,我明白了(感谢您的解释!)。在我的真实案例中,我有一个包含 3 列的数据集。 3 列代表来自一组 动作的 3 个动作。我不再关心这 3 个动作的执行顺序,所以我想将它们转换为一个变量 - 这个变量的值将保留这 3 个动作的名称,而 sort 旨在不关心顺序. 感谢您的所有建议!现在我结束了:states.df.sorted &lt;- as.data.frame(t(apply(states.df, 1, sort))) names(states.df.sorted) &lt;- c("v1", "v2", "v3") new.column = mutate(states.df.sorted, concated_column = paste(v1, v2, v3, sep = '_')) 或者使用链式排列:states.df.sorted 【参考方案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 进行排序,然后按区域和分区打破平局

【讨论】:

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

以上是关于R中的dplyr mutate - 添加列作为列的连接的主要内容,如果未能解决你的问题,请参考以下文章

R语言dplyr包mutate_if函数修改所有满足条件的数据列的内容实战

R语言dplyr包mutate_at函数通过名称修改指定数据列的内容(使用统一的函数)实战

R语言dplyr包mutate_all函数一次性处理所有的数据列的内容(使用统一的函数)实战

R:dplyr 有条件地汇总并重新编码列中的值

R语言dplyr包的mutate函数将列添加到dataframe中或者修改现有的数据列:基于条件判断创建布尔型指示变量将异常离散编码转化为NA值

R语言dplyr包使用mutate函数生成新的数据列(不改变原数据列)实战