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

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

提前感谢您的帮助!

【问题讨论】:

    标签: r dataframe dplyr concat


    【解决方案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 = "")))
    猜你喜欢
    • 2014-09-16
    • 2017-02-01
    • 2019-05-18
    • 2015-09-25
    • 2016-09-17
    • 1970-01-01
    • 2022-08-23
    • 2018-08-17
    • 1970-01-01
    相关资源
    最近更新 更多