136

例如,如果我有这个:

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

那么我如何将这两列n合并s成一个名为的新列x,如下所示:

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

8 回答 8

158

使用 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
于 2013-08-07T23:40:25.230 回答
51

插入分隔符:

df$x <- paste(df$n, "-", df$s)
于 2017-02-27T21:10:50.067 回答
24

正如 Uwe 和 UserR 在评论中已经提到的,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)
于 2018-04-16T14:58:15.667 回答
19

使用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
于 2018-03-10T17:17:15.387 回答
16

一些带有 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
于 2016-12-06T11:58:55.823 回答
12

我们可以使用paste0

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

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

于 2017-04-08T00:25:57.923 回答
7

代替

  • 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 包于 2020-04-10 创建(v0.3.0)

str_c文档中的额外说明

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

于 2018-08-14T15:42:52.550 回答
5

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

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 = ""))
于 2020-04-15T03:28:34.330 回答