একটি ডেটাফ্রেমে দুটি বা ততোধিক কলাম একটি নতুন কলামে নতুন নামের সাথে একত্রিত করুন


113

উদাহরণস্বরূপ যদি আমার কাছে এটি থাকে:

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

উত্তর:


135

ব্যবহার 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 - কীভাবে ডেটা পয়েন্ট ব্যবহার করে একটি বিশেষ চরিত্র যুক্ত করবেন paste()? উপরের উদাহরণস্বরূপ, xকলামে 2-aaতখন 3-bbএবং তার মতো ডেটা থাকা উচিত 5-cc
চেতন অরবিন্দ পাটিল

8
। @ thelatemail - এটি আমার পক্ষে কাজ করেছে:paste(df$n,df$s,sep="-")
চেতন অরবিন্দ পাতিল

4
কলামের sএনএ মান থাকলে আপনি কীভাবে এনএ বাদ দিতে পারবেন ? (আমি দেখতে পছন্দ করি না 3 NAযদি df$s[2]=NA)
Cina

39

বিভাজক serোকানোর জন্য:

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

4
। @ লিটলবি - এটি দুটি তথ্যের মধ্যে একটি স্থান যুক্ত করে। উদাহরণস্বরূপ চূড়ান্ত আউটপুট যেমন: A - Bপরিবর্তে A-B। এই অতিরিক্ত স্থান সরানো সম্ভব?
চেতন অরবিন্দ পাটিল

9
। @ লিটলবি - এটি আমার পক্ষে কাজ করেছে:paste(df$n,df$s,sep="-")
চেতন অরবিন্দ পাতিল

5
পেস্টের পরিবর্তে পেস্ট0 ব্যবহার করুন
ফেরোআও

4
এটি পছন্দসই আউটপুট দেবে না: ওপি উপাদানগুলির মধ্যে একটি জায়গার জন্য জিজ্ঞাসা করবে, অন্য বিভাজক নয় (যা উপায় হিসাবে sepতর্ক হিসাবে আরও ভাল করা হবে ...)। আপনার উত্তর প্রায় 4 বছর পূর্বে পোস্ট করা অন্য উত্তরটি অবশ্য প্রশ্নের সঠিক উত্তর দিচ্ছে।
ক্যাথ

17

ইতিমধ্যে উউই এবং ইউজারআর দ্বারা মন্তব্যগুলিতে উল্লিখিত হিসাবে, 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)

4
এই উদাহরণে এক্স কি?
লেবি

4
@ লেভি, xএটি সম্মিলিত মানগুলিতে থাকা নতুন কলামের নাম উপস্থাপন করে। ডিসিপ্লাইয়ের কথা ভাবেন mutate:df %>% dplyr::mutate(x = "your operations")
ভেসেনেন

14

প্রয়োগগুলি ব্যবহার করে এনএ এবং তাদের অপসারণ সহ কয়েকটি উদাহরণ

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

@ ফেরোও ধন্যবাদ, আপনি আমার জীবন বাঁচালেন। পিএলএস df <x <প্রয়োগ করার আগে পেস্ট_নো ফাংশন সরান move
মালাজিসি

12

ব্যবহার 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

4
না, ইতিমধ্যে বিদ্যমান উত্তর হিসাবে, আপনি পেস্ট ব্যবহার করছেন , পরিবর্তক নয় ।
zx8754

আমি ভেবেছিলাম যে ক এর অংশ হিসাবে কলামগুলি একত্রিত করা যায় তা আমি প্রদর্শন করছি dplyr::mutate()। দুঃখিত, কেবল সহায়ক হওয়ার চেষ্টা করছি - আমি আর সাইটটিকে কলুষিত করব না এবং ভবিষ্যতের পোস্টিং থেকে বিরত থাকব না।
এসবিএ

দুঃখিত, যদি এটি অভদ্র হিসাবে প্রকাশিত হয়। ওপি'র সমস্যাটি মিউটেট ব্যবহার করে সমাধান করা যায় না , প্রশ্ন কীভাবে ডিপ্লাইার ব্যবহার করবেন তা নয় , তবে কলাম মানগুলি কীভাবে একত্রিত করবেন তা নয়। আমি কেবল ইশারা করছি যে তাদের প্রয়োজনীয় পেস্ট না পরিবর্তন ঘটান । আমরা dplyr প্রদর্শন করতে চান সঠিক উপায় হয় ব্যবহার ফাংশন ঐক্যবদ্ধ
zx8754

10

আমরা পেস্ট0 ব্যবহার করতে পারি :

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

আপনি যদি চান না তবে সংক্ষিপ্ত ক্ষেত্রের কোনও প্যাডিং স্পেস চালু করা উচিত। আপনি যদি দুটি ক্ষেত্রের সংমিশ্রণ উপস্থাপন করে এমন এক অনন্য আইডি হিসাবে সম্মিলিত ক্ষেত্রটি ব্যবহার করার পরিকল্পনা করছেন তবে এটি আরও কার্যকর।


7

পরিবর্তে

  • 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"


4
paste0(n,"-",s,".",b)এবং str_c(n,"-",s,".",b)ঠিক একই, উভয়ই একটি ডিফল্ট বিভাজক ব্যবহার করে যা খালি স্ট্রিং ''। আমিও জানি না paste"পরিপাটি" কেন , আপনি বোঝাতে চেয়েছেন যে আপনি স্থান পছন্দ করেন না?
অক্সিমান

paste0এবং str_cএকেবারে এক নয় not এই লিঙ্ক থেকে দেখে নিতে: (1) rdocumentation.org/packages/stringr/versions/1.3.1/topics/str_c (2) stackoverflow.com/questions/53118271/...
avallecam

আহ আমি দেখি! ধন্যবাদ! তারা কীভাবে আলাদা তা এই উত্তরের একটি ভাল সংযোজন হবে (এবং str_cডকুমেন্টেশনটি আরও স্পষ্টিকর হতে পারে!)।
অ্যাকসমান

আপনার পরামর্শের জন্য অক্সিমানকে ধন্যবাদ আমি উত্তরটি আরও সরল করেছি এবং ইস্যুতে একটি অতিরিক্ত নোট যুক্ত করেছি
অ্যাভালেক্যাম

3

অন্যান্য দুর্দান্ত উত্তর রয়েছে তবে আপনি যেখানে কলামের নামগুলি বা কলামগুলির সংখ্যা আগে জেনে নিতে চান না সে ক্ষেত্রে নিম্নলিখিতগুলি কার্যকর।

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 = ""))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.