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 <- 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 = '_'))
或者使用链式排列: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包的mutate函数将列添加到dataframe中或者修改现有的数据列:基于条件判断创建布尔型指示变量将异常离散编码转化为NA值