将数据框中的两列或多列合并为具有新名称的新列

Posted

技术标签:

【中文标题】将数据框中的两列或多列合并为具有新名称的新列【英文标题】:Combine two or more columns in a dataframe into a new column with a new name 【发布时间】:2013-08-09 13:08:33 【问题描述】:

例如,如果我有这个:

n = c(2, 3, 5) 
s = c("aa", "bb", "cc") 
b = c(TRUE, FALSE, TRUE) 
df = data.frame(n, s, b)

  n  s     b
1 2 aa  TRUE
2 3 bb FALSE
3 5 cc  TRUE

那么如何将ns 这两列合并成一个名为x 的新列,使其看起来像这样:

  n  s     b     x
1 2 aa  TRUE  2 aa
2 3 bb FALSE  3 bb
3 5 cc  TRUE  5 cc

【问题讨论】:

【参考方案1】:

还有其他很好的答案,但在您不知道列名或要预先连接的列数的情况下,以下内容很有用。

df = data.frame(x = letters[1:5], y = letters[6:10], z = letters[11:15])
colNames = colnames(df) # could be any number of column names here
df$newColumn = apply(df[, colNames, drop = F], MARGIN = 1, FUN = function(i) paste(i, collapse = ""))

【讨论】:

【参考方案2】:

代替

paste(默认空格), paste0(强制包含缺少的NA 作为字符)或 unite(限制为 2 列和 1 个分隔符),

我建议像paste0 一样灵活的替代方案,但更小心NAstringr::str_c

library(tidyverse)

# check the missing value!!
df <- tibble(
  n = c(2, 2, 8),
  s = c("aa", "aa", NA_character_),
  b = c(TRUE, FALSE, TRUE)
)

df %>% 
  mutate(
    paste = paste(n,"-",s,".",b),
    paste0 = paste0(n,"-",s,".",b),
    str_c = str_c(n,"-",s,".",b)
  ) %>% 

  # convert missing value to ""
  mutate(
    s_2=str_replace_na(s,replacement = "")
  ) %>% 
  mutate(
    str_c_2 = str_c(n,"-",s_2,".",b)
  )
#> # A tibble: 3 x 8
#>       n s     b     paste          paste0     str_c      s_2   str_c_2   
#>   <dbl> <chr> <lgl> <chr>          <chr>      <chr>      <chr> <chr>     
#> 1     2 aa    TRUE  2 - aa . TRUE  2-aa.TRUE  2-aa.TRUE  "aa"  2-aa.TRUE 
#> 2     2 aa    FALSE 2 - aa . FALSE 2-aa.FALSE 2-aa.FALSE "aa"  2-aa.FALSE
#> 3     8 <NA>  TRUE  8 - NA . TRUE  8-NA.TRUE  <NA>       ""    8-.TRUE

由reprex package (v0.3.0) 于 2020-04-10 创建

str_c 文档的额外说明

与大多数其他 R 函数一样,缺失值具有“传染性”:每当缺失值与另一个字符串组合时,结果总是会缺失。使用str_replace_na()NA 转换为"NA"

【讨论】:

paste0(n,"-",s,".",b)str_c(n,"-",s,".",b) 完全相同,都使用默认分隔符,即空字符串''。我也不知道paste为什么“整洁”,你的意思是你不喜欢空格? paste0str_c 并不完全相同。看看这些链接:(1)rdocumentation.org/packages/stringr/versions/1.3.1/topics/str_c(2)***.com/questions/53118271/… 啊,我明白了!谢谢!它们有何不同将是对这个答案的一个很好的补充(str_c 文档也可能更加明确!)。 @Axeman 感谢您的建议。我已经简化了答案并添加了关于该问题的额外说明【参考方案3】:

我们可以使用paste0

df$combField <- paste0(df$x, df$y)

如果您不希望在连接字段中引入任何填充空间。如果您计划将组合字段用作表示两个字段组合的唯一 ID,这将更加有用。

【讨论】:

【参考方案4】:

用于插入分隔符:

df$x <- paste(df$n, "-", df$s)

【讨论】:

.@LittleBee - 这会在两个数据之间添加一个空格。例如,最终输出类似于:A - B 而不是 A-B。是否可以删除这个多余的空间? .@LittleBee - 这对我有用:paste(df$n,df$s,sep="-") 用 paste0 代替 paste 这不会给出所需的输出:OP 要求元素之间有一个空格,而不是另一个分隔符(顺便说一下,最好将其作为 sep 参数... )。另一个答案比您早近 4 年发布,但是完美地回答了这个问题。【参考方案5】:

一些带有 NA 的示例以及使用 apply 删除它们

n = c(2, NA, NA) 
s = c("aa", "bb", NA) 
b = c(TRUE, FALSE, NA) 
c = c(2, 3, 5) 
d = c("aa", NA, "cc") 
e = c(TRUE, NA, TRUE) 
df = data.frame(n, s, b, c, d, e)

paste_noNA <- function(x,sep=", ") 
gsub(", " ,sep, toString(x[!is.na(x) & x!="" & x!="NA"] ) ) 

sep=" "
df$x <- apply( df[ , c(1:6) ] , 1 , paste_noNA , sep=sep)
df

【讨论】:

@Ferroao 谢谢,你救了我的命。请在 df$x 之前移动 paste_noNA 函数 【参考方案6】:

正如 Uwe 和 UserR 在 cmets 中已经提到的,tidyverse 格式的一般解决方案是使用命令 unite

library(tidyverse)

n = c(2, 3, 5) 
s = c("aa", "bb", "cc") 
b = c(TRUE, FALSE, TRUE) 

df = data.frame(n, s, b) %>% 
  unite(x, c(n, s), sep = " ", remove = FALSE)

【讨论】:

本例中的 x 是什么? @Levi,x 表示包含组合值的新列的名称。想想 dplyr 的 mutate: df %&gt;% dplyr::mutate(x = "your operations")【参考方案7】:

使用dplyr::mutate

library(dplyr)
df <- mutate(df, x = paste(n, s)) 

df 
> df
  n  s     b    x
1 2 aa  TRUE 2 aa
2 3 bb FALSE 3 bb
3 5 cc  TRUE 5 cc

【讨论】:

不,作为已经存在的答案,您使用的是 paste,而不是 mutate 我以为我在演示如何将列组合为dplyr::mutate() 的一部分。抱歉,只是想提供帮助 - 我不会再污染网站,也不会再发帖了。 对不起,如果它显得粗鲁。 OP的问题不是用mutate解决的,问题不在于如何使用dplyr,而是如何组合列值。我只是指出他们需要 paste 而不是 mutate。如果我们要演示dplyr正确的方法是using the function unite.【参考方案8】:

使用paste

 df$x <- paste(df$n,df$s)
 df
#   n  s     b    x
# 1 2 aa  TRUE 2 aa
# 2 3 bb FALSE 3 bb
# 3 5 cc  TRUE 5 cc

【讨论】:

.@thelatemail - 如何使用paste() 在数据点之间添加特殊字符?对于上面的例子,x 列的数据应该是2-aa,然后是3-bb5-cc .@thelatemail - 这对我有用:paste(df$n,df$s,sep="-") 如果列 s 具有 NA 值,如何省略 NA? (如果df$s[2]=NA,我不喜欢看到3 NA

以上是关于将数据框中的两列或多列合并为具有新名称的新列的主要内容,如果未能解决你的问题,请参考以下文章

如何合并DataSet中的两列?

试图在r中隔离数据框中的两列[重复]

需要合并数据框中的两列[重复]

如何基于每个数据框中具有不同名称的两列将两个数据框与 dplyr 连接起来? [复制]

基于两列或多列的 Spark DataFrame 聚合

R 中merge()函数匹配数据或根据一列或多列来合并两个数据框