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 n
en s
in een nieuwe kolom met de naam x
zodat 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 unite
te 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 ontbrekendNA
als teken) ofunite
(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) sup>
extra opmerking uit de str_c
documentatie
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()
omNA
te 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 = ""))