Combineer twee of meer kolommen in een dataframe tot een nieuwe kolom met een nieuwe naam

Als ik bijvoorbeeld dit heb:

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

Hoe combineer ik dan de twee kolommen nen sin een nieuwe kolom met de naam xzodat deze er als volgt uitziet:

p>

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

Antwoord 1, autoriteit 100%

Gebruik 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

Antwoord 2, autoriteit 33%

Voor het invoegen van een scheidingsteken:

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

Antwoord 3, autoriteit 15%

Zoals al vermeld in opmerkingen van Uwe en UserR, zou een algemene oplossing in het tidyverse-formaat zijn om het commando unitete gebruiken:

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)

Antwoord 4, autoriteit 9%

Gebruik 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

Antwoord 5, autoriteit 9%

Enkele voorbeelden met NA’s en hun verwijdering met toepassen

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

Antwoord 6, autoriteit 8%

We kunnen paste0gebruiken:

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

Als u geen opvulruimte wilt toevoegen aan het aaneengeschakelde veld. Dit is handiger als u van plan bent het gecombineerde veld te gebruiken als een unieke id die combinaties van twee velden vertegenwoordigt.


Antwoord 7, autoriteit 5%

In plaats van

  • paste(standaard spaties),
  • paste0(dwing het opnemen van ontbrekend NAals teken) of
  • unite(beperkt tot 2 kolommen en 1 scheidingsteken),

Ik zou een alternatief willen voorstellen dat zo flexibel is als paste0, maar voorzichtiger is met NA: stringr::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

Gemaakt op 2020-04-10 door het reprex-pakket(v0.3.0)

extra opmerking uit de str_cdocumentatie

Zoals de meeste andere R-functies zijn ontbrekende waarden “besmettelijk”: wanneer een ontbrekende waarde wordt gecombineerd met een andere tekenreeks, zal het resultaat altijd ontbreken. Gebruik str_replace_na()om NAte converteren naar "NA"


Antwoord 8, autoriteit 3%

Er zijn andere geweldige antwoorden, maar in het geval dat u de kolomnamen of het aantal kolommen dat u wilt samenvoegen niet vooraf weet, is het volgende handig.

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 = ""))

Other episodes