डेटाफ़्रेम में दो या अधिक स्तंभों को एक नए नाम के साथ एक नए कॉलम में मिलाएं


104

उदाहरण के लिए अगर मेरे पास यह है:

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

जवाबों:


129

का उपयोग करें 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

। @ thelmail - उपयोग करने वाले डेटा बिंदुओं के बीच एक विशेष चरित्र कैसे जोड़ें paste()? उपरोक्त उदाहरण के लिए, xस्तंभ में डेटा और 2-aaफिर होना चाहिए । 3-bb5-cc
चेतन अरविंद पाटिल

8
। @ Thelatemail - इसने मेरे लिए काम किया:paste(df$n,df$s,sep="-")
चेतन अरविंद पाटिल

2
यदि स्तंभ sNA का मान है तो आप NA को कैसे छोड़ सकते हैं ? (मुझे यह देखना पसंद नहीं है 3 NAकि df$s[2]=NA)
Cina

34

विभाजक डालने के लिए:

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

1
। @ LittleBee - यह दो डेटा के बीच एक स्थान जोड़ता है। उदाहरण के लिए अंतिम आउटपुट की तरह है: के A - Bबजाय A-B। क्या इस अतिरिक्त स्थान को निकालना संभव है?
चेतन अरविंद पाटिल

8
। @ लिटिलबी - इसने मेरे लिए काम किया:paste(df$n,df$s,sep="-")
चेतन अरविंद पाटिल

5
पेस्ट के बजाय पेस्ट 0 का उपयोग करें
फेरोओ

3
यह वांछित आउटपुट नहीं देगा: ओपी तत्वों के बीच एक स्थान के लिए पूछता है, न कि एक और विभाजक (जो, वैसे, sepतर्क के रूप में बेहतर होगा ...)। अन्य उत्तर, लगभग 4 साल पहले पोस्ट किया गया था, लेकिन इस सवाल का पूरी तरह से जवाब दे रहा है।
कैथ

16

जैसा कि Uwe और UseR द्वारा टिप्पणियों में पहले ही उल्लेख किया गया है, 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)

2
इस उदाहरण में x क्या है?
लेवी

@ लेवी, वह x नए कॉलम के नाम का प्रतिनिधित्व करती है जिसमें संयुक्त मूल्य होते हैं। Dplyr के बारे में सोचो mutate:df %>% dplyr::mutate(x = "your operations")
Vesanen

13

NA के साथ कुछ उदाहरण और उनके उपयोग को हटाने का उपयोग लागू होता है

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
यदि आप tidyrमूल प्रश्न के अपेक्षित उत्तर को पुन: पेश करने के लिए पैकेज का उपयोग करना चाहते हैं तो यह एक-लाइनर होगा tidyr::unite(df, x, n, s, sep = " ", remove = FALSE)[, c(names(df), "x")]:। हालाँकि, मुझे ऐसा करने का कोई कारण नहीं दिखता है क्योंकि df$x <- paste(df$n,df$s)यह बहुत सरल है।
Uwe

@ फ़ेरोआओ, उत्तर भी बहुत सामान्य नहीं होने चाहिए, अन्यथा हर प्रश्न में एक विशाल उत्तर होगा जिसमें सब कुछ शामिल होगा। NA का निष्कासन ओपी के सरल प्रश्न का हिस्सा नहीं था, इसलिए मैं यह नहीं देखता कि अतिरिक्त जटिलता एक साधारण pasteया कैसे मूल्य जोड़ता है tidyr::unite
avid_useR

@Ferroao धन्यवाद, आपने मेरी जान बचाई। pls $ $ <<-apply से पहले paste_noNA फ़ंक्शन को स्थानांतरित करें।
मालजिसी

11

का उपयोग कर 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
नहीं, पहले से मौजूद उत्तर के रूप में, आप पेस्ट का उपयोग कर रहे हैं , म्यूट नहीं ।
zx8754

मुझे लगा कि मैं प्रदर्शित कर रहा हूं कि कॉलम को एक के एक भाग के रूप में कैसे जोड़ा जा सकता है dplyr::mutate()। क्षमा करें, बस मददगार बनने की कोशिश कर रहा हूं - मैं अब साइट को प्रदूषित नहीं करूंगा और भविष्य की पोस्टिंग को रोक दूंगा।
sbha

क्षमा करें, अगर यह असभ्य के रूप में सामने आया। उत्परिवर्ती का उपयोग करके ओपी की समस्या हल नहीं की गई है , सवाल यह नहीं है कि डंपलर का उपयोग कैसे किया जाए , लेकिन कॉलम के मूल्यों को कैसे संयोजित किया जाए। मैं बस उनका कहना है कि वे जरूरत पेस्ट नहीं में बदलें । हम दिखाना चाहते हैं dplyr सही तरीका है का उपयोग कर समारोह को एकजुट
zx8754

9

हम पेस्ट 0 का उपयोग कर सकते हैं :

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

यदि आप नहीं चाहते हैं कि किसी भी पैडिंग स्पेस को कॉन्टेनेटेड फील्ड में पेश किया जाए। यह अधिक उपयोगी है यदि आप संयुक्त फ़ील्ड को एक अद्वितीय आईडी के रूप में उपयोग करने की योजना बना रहे हैं जो दो क्षेत्रों के संयोजन का प्रतिनिधित्व करता है।


6

के बजाय

  • paste (डिफ़ॉल्ट स्थान),
  • paste0( NAचरित्र के रूप में लापता होने के समावेश को मजबूर करें ) या
  • unite (2 कॉलम और 1 विभाजक के लिए विवश),

मैं लचीला के रूप में एक विकल्प का सुझाव देंगे paste0 अधिक सावधान लेकिन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 को रेप्रेक्स पैकेज (v0.3.0) द्वारा बनाया गया

str_cप्रलेखन से अतिरिक्त ध्यान दें

अधिकांश अन्य आर कार्यों की तरह, लापता मूल्य "संक्रामक" हैं: जब भी एक लापता मूल्य को एक और स्ट्रिंग के साथ जोड़ा जाता है तो परिणाम हमेशा गायब होगा। str_replace_na()में परिवर्तित NAकरने के लिए उपयोग करें"NA"


1
paste0(n,"-",s,".",b)और str_c(n,"-",s,".",b)बिल्कुल समान हैं, दोनों एक डिफ़ॉल्ट विभाजक का उपयोग करते हैं जो खाली स्ट्रिंग है ''। मैं यह भी नहीं जानता कि paste"सुव्यवस्थित" क्यों है, आपका मतलब है कि आप रिक्त स्थान पसंद नहीं करते हैं?
एक्समैन

paste0और str_cवास्तव में समान नहीं हैं। इन लिंक पर एक नज़र डालें: (1) rdocumentation.org/packages/stringr/versions/1.3.1/topics/str_c (2) stackoverflow.com/questions/53118271/…
avccamcam

ओह समझा! धन्यवाद! वे कैसे भिन्न हैं, इस उत्तर के लिए एक अच्छा जोड़ होगा (और str_cदस्तावेज़ीकरण अधिक विस्फोटक भी हो सकता है!)।
एक्समैन

@Axeman आपके सुझाव के लिए धन्यवाद। मैं इस सवाल का जवाब सरलीकृत प्लस पर इस मुद्दे के लिए एक अतिरिक्त टिप्पणी जोड़ दिया है
avallecam

2

अन्य महान उत्तर हैं, लेकिन उस मामले में जहां आप स्तंभ नाम या उन स्तंभों की संख्या नहीं जानते हैं जिन्हें आप पहले से संक्षिप्त करना चाहते हैं, निम्नलिखित उपयोगी है।

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 = ""))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.