Bir veri çerçevesindeki iki veya daha fazla sütunu yeni bir adla yeni bir sütunda birleştirin


106

Örneğin şuna sahipsem:

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

O zaman iki sütunu nve şu şekilde görünecek şekilde sadlandırılan yeni bir sütunda nasıl birleştiririm x:

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

Yanıtlar:


130

Kullanın 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 - kullanarak veri noktaları arasına özel bir karakter nasıl eklenir paste()? Yukarıdaki örnek için, xsütun 2-aa, sonra 3-bbve gibi verilere sahip olmalıdır 5-cc.
Chetan Arvind Patil

8
. @ thelatemail - Bu benim için çalıştı:paste(df$n,df$s,sep="-")
Chetan Arvind Patil

2
Sütun sNA değerine sahipse NA'yı nasıl atlayabilirsiniz ? (I görmek sevmiyorum 3 NAeğer df$s[2]=NA)
Cina

36

Ayırıcı eklemek için:

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

1
. @ LittleBee - Bu, iki veri arasına bir boşluk ekler. Örneğin nihai çıktı şuna benzer: A - Byerine A-B. Bu fazladan alanı kaldırmak mümkün mü?
Chetan Arvind Patil

9
. @ LittleBee - Bu benim için çalıştı:paste(df$n,df$s,sep="-")
Chetan Arvind Patil

5
yapıştırmak yerine paste0 kullanın
Ferroao

3
Bu istenen çıktıyı vermez: OP, başka bir ayırıcı değil, öğeler arasında bir boşluk ister (bu arada, separgüman olarak daha iyi koyulur ...). Sizinkinden neredeyse 4 yıl önce gönderilen diğer cevap, soruyu mükemmel bir şekilde yanıtlıyor.
Cath

16

Uwe ve UseR tarafından yapılan yorumlarda daha önce belirtildiği gibi, tidyverseformatta genel bir çözüm şu komutu kullanmak olacaktır 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)

2
Bu örnekte x nedir?
Levi

@Levi, xbirleştirilmiş değerleri içeren yeni sütunun adını temsil eder. Dplyr'leri düşünün mutate:df %>% dplyr::mutate(x = "your operations")
Vesanen

13

NA'larla ilgili bazı örnekler ve bunların uygulayarak kaldırılması

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

2
Kullanmak isterseniz tidyrasıl soruya beklenen cevabı çoğaltmak paketi bu tek liner olacaktır: tidyr::unite(df, x, n, s, sep = " ", remove = FALSE)[, c(names(df), "x")]. Ancak, df$x <- paste(df$n,df$s)çok daha basit olduğu için bunu yapmak için bir neden göremiyorum .
Uwe

@Ferroao Pekala, cevaplar da çok genel olmamalı, aksi takdirde her sorunun sadece her şeyi içeren dev bir cevabı olacaktır. NA'ların kaldırılması OP'nin basit sorusunun bir parçası değildi, bu yüzden bu ekstra karmaşıklığın basit pasteveya tidyr::unite.
avid_useR

@Ferroao Teşekkürler, hayatımı kurtardın. pls paste_noNA işlevini df $ x <-apply'den önce hareket ettirin.
malajisi

11

Kullanarak 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

1
Hayır, zaten mevcut cevaplar gibi, mutate değil, yapıştır kullanıyorsunuz .
zx8754

A'nın bir parçası olarak sütunların nasıl birleştirilebileceğini gösterdiğimi sanıyordum dplyr::mutate(). Üzgünüm, sadece yardımcı olmaya çalışıyorum - Artık siteyi kirletmeyeceğim ve gelecekteki ilanlardan kaçınmayacağım.
sbha

Üzgünüm, kaba göründüyse. OP'ın sorun kullanılarak çözülmüş değil mutasyona , soru nasıl kullanılacağı hakkında değil dplyr ama sütun değerleri nasıl birleştirileceğini. Mutasyona değil, yapıştırmaya ihtiyaçları olduğuna işaret ediyorum . Dplyr'ı doğru şekilde göstermek istiyorsak, unite fonksiyonunu kullanmaktır .
zx8754

9

Paste0 kullanabiliriz :

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

Birleştirilmiş alana herhangi bir dolgu alanı eklenmesini istemiyorsanız. Bu, birleştirilmiş alanı iki alanın kombinasyonlarını temsil eden benzersiz bir kimlik olarak kullanmayı planlıyorsanız daha kullanışlıdır.


6

Onun yerine

  • paste (varsayılan boşluklar),
  • paste0(eksik NAkarakter olarak dahil edilmeye zorlanır ) veya
  • unite (2 sütun ve 1 ayırıcı ile sınırlıdır),

Bu kadar esnek paste0ancak daha dikkatli bir alternatif öneririm 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

2020-04-10 tarihinde reprex paketi tarafından oluşturuldu (v0.3.0)

str_cbelgelerden ekstra not

Diğer birçok R işlevi gibi, eksik değerler "bulaşıcıdır": eksik bir değer başka bir dizeyle birleştirildiğinde sonuç her zaman eksik olacaktır. str_replace_na()Dönüştürmek NAiçin kullanın"NA"


1
paste0(n,"-",s,".",b)ve str_c(n,"-",s,".",b)tamamen aynıdır, her ikisi de boş dize olan varsayılan bir ayırıcı kullanır ''. Ayrıca neden paste"düzenli" olduğunu bilmiyorum, boşlukları sevmediğini mi söylüyorsun?
Axeman

paste0ve str_ctam olarak aynı değildir. şu bağlantılara bir göz atın: (1) rdocumentation.org/packages/stringr/versions/1.3.1/topics/str_c (2) stackoverflow.com/questions/53118271/…
avallecam

Ah, anlıyorum! Teşekkürler! Nasıl farklı oldukları bu yanıta iyi bir katkı olacaktır (ve str_cdokümantasyon da daha açıklayıcı olabilir!).
Axeman

@Axeman öneriniz için teşekkürler. Cevabı basitleştirdim ve konuya fazladan bir not ekledim
avallecam

2

Başka harika cevaplar da var, ancak önceden birleştirmek istediğiniz sütun adlarını veya sütun sayısını bilmediğiniz durumda, aşağıdakiler yararlıdır.

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 = ""))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.