ডেটা.ফ্রেম কলামগুলি ফ্যাক্টর থেকে অক্ষরে রূপান্তর করুন


351

আমার একটি ডেটা ফ্রেম আছে আসুন তাকে ফোন করুন bob:

> head(bob)
                 phenotype                         exclusion
GSM399350 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399351 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399352 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399353 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399354 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399355 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-

আমি এই ডেটা ফ্রেমের সারিগুলিকে সম্মতি জানাতে চাই (এটি অন্য একটি প্রশ্ন হবে)। কিন্তু দেখ:

> class(bob$phenotype)
[1] "factor"

Bobএর কলামগুলি ফ্যাক্টর। সুতরাং, উদাহরণস্বরূপ:

> as.character(head(bob))
[1] "c(3, 3, 3, 6, 6, 6)"       "c(3, 3, 3, 3, 3, 3)"      
[3] "c(29, 29, 29, 30, 30, 30)"

আমি এটি বুঝতে শুরু করি না, তবে আমি অনুমান করি যেগুলি কলামগুলির (কিং ক্যারাকটাকাসের আদালতের) কলামগুলির কারণগুলির স্তরের সূচকগুলি bob? আমার যা প্রয়োজন তা নয়

আশ্চর্যের সাথে আমি bobহাতের কলামগুলি দিয়ে যেতে পারি এবং করতে পারি

bob$phenotype <- as.character(bob$phenotype)

যা ভাল কাজ করে। এবং, কিছু টাইপ করার পরে, আমি একটি ডেটা ফ্রেম পেতে পারি যার কলামগুলি উপাদানগুলির চেয়ে অক্ষর। সুতরাং আমার প্রশ্ন: আমি কীভাবে এটি স্বয়ংক্রিয়ভাবে করতে পারি? আমি কীভাবে প্রতিটি কলামে ম্যানুয়ালি না গিয়ে চরিত্র কলামগুলির সাথে ফ্যাক্টর কলামগুলির সাথে ডেটাফ্রেমকে ডেটাতে রূপান্তর করব?

বোনাস প্রশ্ন: ম্যানুয়াল পদ্ধতির কাজ কেন?


3
আপনি যদি প্রশ্নটিকে পুনরায় প্রজননযোগ্য করে তুলতে পারেন তবে এর কাঠামোটি অন্তর্ভুক্ত করুন bob
জঙ্গোরেকি

উত্তর:


362

স্রেফ ম্যাট এবং ডর্ককে অনুসরণ করছে। আপনি যদি বিশ্বব্যাপী বিকল্পটি পরিবর্তন না করেই আপনার বিদ্যমান ডেটা ফ্রেমটি পুনরায় তৈরি করতে চান তবে আপনি এটিকে একটি প্রয়োগ বিবৃতি দিয়ে পুনরায় তৈরি করতে পারেন:

bob <- data.frame(lapply(bob, as.character), stringsAsFactors=FALSE)

এটি সমস্ত ভেরিয়েবলগুলি "অক্ষর" শ্রেণীতে রূপান্তরিত করবে, আপনি যদি কেবলমাত্র উপাদানকে রূপান্তর করতে চান তবে নীচে মারেকের সমাধান দেখুন

@ হ্যাডলি যেমন উল্লেখ করেছেন, নীচে আরও সংক্ষিপ্ত রয়েছে।

bob[] <- lapply(bob, as.character)

উভয় ক্ষেত্রে, lapplyএকটি তালিকা আউটপুট; যাইহোক, আর []এর icalন্দ্রজালিক বৈশিষ্ট্যগুলির কারণে, দ্বিতীয় ক্ষেত্রে ব্যবহারের bobফলে অবজেক্টের ডেটা.ফ্রেম শ্রেণি রাখা হয় , যার ফলে as.data.frameযুক্তির সাহায্যে একটি ডেটা.ফ্রেমে ফিরে রূপান্তরিত হওয়া প্রয়োজন হয় stringsAsFactors = FALSE


27
শেন, এটি সংখ্যার কলামগুলিকেও অক্ষরে পরিণত করবে।
ডার্ক এডেলবুয়েটেল

@ ডির্ক: এটি সত্য, যদিও এটি এখানে সমস্যা কিনা তা পরিষ্কার নয়। স্পষ্টতই, সামনে সঠিকভাবে জিনিস তৈরি করা সেরা সমাধান। আমি মনে করি না যে কোনও ডেটা ফ্রেম জুড়ে স্বয়ংক্রিয়ভাবে ডেটা ধরণের রূপান্তর করা সহজ । একটি বিকল্প হ'ল উপরেরটি ব্যবহার করুন তবে তারপরে type.convertসমস্ত কিছু characteringালাইয়ের পরে ব্যবহার করুন , তারপরে আবার পুনরায় factorsআটকে দিন character
শেন

এটি সারির নামগুলি বাতিল করে দেয় বলে মনে হচ্ছে।
পিকক্ল্বো

2
@ পাইকোল্বো আপনি bob[] <- উদাহরণটিতে ব্যবহার করেছেন বা bob <- ?; প্রথমটি ডাটা.ফ্রেমে রাখে; দ্বিতীয়টি ডেটা.ফ্রেমে একটি তালিকায় পরিবর্তন করে, রওনের নামগুলি ফেলে যাচ্ছে। আমি উত্তরটি আপডেট করব
ডেভিড লেবাউর

6
একটি বৈকল্পিক যা কেবল অজ্ঞাতনামা ফাংশন ব্যবহার করে ফ্যাক্টর কলামগুলিকে অক্ষরে রূপান্তরিত করে: iris[] <- lapply(iris, function(x) if (is.factor(x)) as.character(x) else {x})
স্টিফান এফ

313

শুধুমাত্র কারণগুলি প্রতিস্থাপন করতে:

i <- sapply(bob, is.factor)
bob[i] <- lapply(bob[i], as.character)

২.০.০ সংস্করণেmutate_if প্যাকেজ ডিপিপ্লায়ার মধ্যে নতুন ফাংশন চালু হয়েছিল :

library(dplyr)
bob %>% mutate_if(is.factor, as.character) -> bob

আরস্টুডিও থেকে প্যাকেজ purrr অন্য একটি বিকল্প দেয়:

library(purrr)
library(dplyr)
bob %>% map_if(is.factor, as.character) %>% as_tibble -> bob

দুঃখের সাথে আমার পক্ষে কাজ করছেন না। কেন জানি না। আমার নাম থাকতে পারে বলেই সম্ভবত?
18:34

@ মোহাওকজোন ইস্যু করা উচিত নয়। আপনি ত্রুটি পেয়েছেন বা ফলাফল আপনি প্রত্যাশা হিসাবে না?
মারেক

2
দ্রষ্টব্য: purrrরেখাটি একটি তালিকা দেয়, একটি নয় data.frame!
রয়েলটিএস

আপনার যদি ইতিমধ্যে এটির iভেক্টর থাকে তবে এটিও কাজ করে colnames()
verbamour

39

গ্লোবাল বিকল্প

স্ট্রিংএফ্যাক্টর: ডেটা.ফ্রেম এবং রিড.ট্যাবলের যুক্তিগুলির জন্য ডিফল্ট সেটিং।

FALSEআপনার স্টার্টআপ ফাইলগুলিতে আপনি সেট করতে চান এমন কিছু হতে পারে (যেমন ~ / .Rprofile)। দয়া করে দেখুন help(options)


5
এটির সাথে সমস্যাটি হ'ল আপনি যখন এমন পরিবেশে আপনার কোডটি কার্যকর করেন তখন that .রফ ফাইলটি অনুপস্থিত থাকে আপনি বাগ পাবেন!
ওয়েফারথিন

4
আমি সেটটি .R প্রোফাইলে থাকা পরিবর্তে স্ক্রিপ্টগুলির শুরুতে কল করব।
গ্রেগম্যাকফার্লেন

22

কীভাবে উপাদানগুলি সংরক্ষণ করা হয় তা যদি আপনি বুঝতে পারেন তবে এটি সম্পাদন করতে আপনি প্রয়োগ ভিত্তিক ফাংশনগুলি এড়াতে পারবেন। যা প্রয়োগ নির্দেশগুলি ভালভাবে কাজ করে না তা বোঝানোর জন্য মোটেও তা নয়।

'স্তরের' তালিকার সাথে যুক্ত সংখ্যাসূচক সূচক হিসাবে উপাদানগুলি কাঠামোগত হয় tied আপনি যদি কোনও ফ্যাক্টরকে সংখ্যায় রূপান্তর করেন তবে এটি দেখা যায়। তাই:

> fact <- as.factor(c("a","b","a","d")
> fact
[1] a b a d
Levels: a b d

> as.numeric(fact)
[1] 1 2 1 3

শেষ লাইনে ফিরে আসা সংখ্যাগুলি ফ্যাক্টরের স্তরের সাথে সামঞ্জস্য হয়।

> levels(fact)
[1] "a" "b" "d"

লক্ষ্য করুন যে levels()অক্ষরের একটি অ্যারের প্রদান করে। আপনি এই সত্যটি সহজেই এবং সংক্ষিপ্তভাবে উপাদানগুলিকে স্ট্রিং বা সংখ্যায় রূপান্তর করতে ব্যবহার করতে পারেন:

> fact_character <- levels(fact)[as.numeric(fact)]
> fact_character
[1] "a" "b" "a" "d"

এটি সংখ্যার মানগুলির জন্যও কাজ করে, আপনি আপনার অভিব্যক্তিটি মোড়ানো রাখেন as.numeric()

> num_fact <- factor(c(1,2,3,6,5,4))
> num_fact
[1] 1 2 3 6 5 4
Levels: 1 2 3 4 5 6
> num_num <- as.numeric(levels(num_fact)[as.numeric(num_fact)])
> num_num
[1] 1 2 3 6 5 4

এই উত্তরটি সমস্যার সমাধান করে না, যা আমি নিজের ডেটা ফ্রেমের সমস্ত ফ্যাক্টর কলামগুলিকে অক্ষরে রূপান্তর করব। as.character(f), পাঠযোগ্যতা এবং দক্ষতা উভয়ই ভাল levels(f)[as.numeric(f)]। আপনি যদি চালাক হতে চান তবে আপনি levels(f)[f]পরিবর্তে ব্যবহার করতে পারেন । দ্রষ্টব্য যে সংখ্যার মানগুলির সাথে কোনও ফ্যাক্টর রূপান্তরিত করার সময়, আপনি as.numeric(levels(f))[f]ওভার থেকে কিছু উপকার পাবেন , যেমন as.numeric(as.character(f)), তবে এটি আপনাকে কেবলমাত্র স্তরগুলিকে সংখ্যাসূচক রূপান্তর করতে হবে এবং তারপরে সাবসেট করতে হবে। as.character(f)ঠিক যেমন ঠিক আছে ঠিক তেমন
দে নভো

20

আপনি যদি কোনও নতুন ডেটা ফ্রেম চান bobcযেখানে প্রতিটি ফ্যাক্টর ভেক্টরকে bobfএকটি অক্ষর ভেক্টরে রূপান্তর করা হয় তবে এটি চেষ্টা করে দেখুন:

bobc <- rapply(bobf, as.character, classes="factor", how="replace")

এরপরে আপনি যদি এটিকে আবার রূপান্তর করতে চান তবে আপনি একটি লজিকাল ভেক্টর তৈরি করতে পারেন যার কোন কলামগুলি ফ্যাক্টর, এবং এটি ব্যবহার করে বেছে বেছে প্রয়োগ করতে

f <- sapply(bobf, class) == "factor"
bobc[,f] <- lapply(bobc[,f], factor)

2
কেবল যা প্রয়োজন ছিল তা করার জন্য +1 (যেমন সম্পূর্ণ ডেটাফ্রেমকে অক্ষরে রূপান্তর না করা)। এই দ্রবণটি একটি ডেটা ফ্রেমে শক্তিশালী যা এতে মিশ্রিত প্রকার রয়েছে।
জোশুয়া উলিরিচ

3
এই উদাহরণটি র‍্যাপলির জন্য 'উদাহরণস্বরূপ' বিভাগে থাকতে হবে, যেমন: স্টেট.এটিজ.চ / আর- ম্যানুয়াল / আর- ডেভেল / লাইবারি / বেস / html / rapply.html । যে কেউ তাই কিভাবে অনুরোধ করতে জানেন?
ম্যাপেটিস

যদি আপনি কোনও ডেটা ফ্রেম দিয়ে শেষ করতে চান তবে সরলভাবে একটি ডেটা.ফ্রেম কলটিতে জড়ান (মিথ্যা যুক্তি অনুসারে স্ট্রিংএফ্যাক্টর ব্যবহার করে)
টেলরড ওয়েব সাইটগুলি

13

আমি সাধারণত আমার সমস্ত প্রকল্পগুলি বাদ দিয়ে এই ফাংশনটি করি। দ্রুত এবং সহজ।

unfactorize <- function(df){
  for(i in which(sapply(df, class) == "factor")) df[[i]] = as.character(df[[i]])
  return(df)
}

8

আর একটি উপায় হ'ল প্রয়োগ ব্যবহার করে রূপান্তর করা

bob2 <- apply(bob,2,as.character)

এবং আরও ভাল একটি (পূর্ববর্তীটি 'ম্যাট্রিক্স' শ্রেণীর)

bob2 <- as.data.frame(as.matrix(bob),stringsAsFactors=F)

শেনের মন্তব্য অনুসরণ করে: as.data.frame(lapply(...
ডেটা.ফ্রেম

7

আপডেট: এখানে এমন কোনও কাজের উদাহরণ যা কাজ করে না। আমি ভেবেছিলাম এটি হবে তবে আমি মনে করি যে স্ট্রিংসএফ্যাক্টর বিকল্পটি কেবল চরিত্রের স্ট্রিংগুলিতে কাজ করে - এটি কারণগুলি একা ফেলে দেয়।

এটা চেষ্টা কর:

bob2 <- data.frame(bob, stringsAsFactors = FALSE)

সাধারণত বলতে গেলে, যখনই আপনার চরিত্রগুলি হওয়া উচিত এমন সমস্যাগুলির সাথে সমস্যা দেখা stringsAsFactorsদিচ্ছে, আপনাকে সাহায্য করার জন্য কোথাও একটি সেটিংস রয়েছে (বিশ্বব্যাপী সেটিং সহ)।


1
এটি কাজ করে, যদি সে bobশুরু করার সময় এটি সেট করে (তবে সত্যের পরে নয়)।
শেন

ঠিক। কেবল পরিষ্কার হতে চেয়েছিলেন যে এটি সমস্যার সমাধান করে না, প্রতি সে - - তবে এটি এটি প্রতিরোধ করে না বলে মনে করার জন্য ধন্যবাদ।
ম্যাট পার্কার

7

অথবা আপনি চেষ্টা করতে পারেন transform:

newbob <- transform(bob, phenotype = as.character(phenotype))

আপনি প্রতিটি চরিত্রকে অক্ষরে রূপান্তর করতে চান তা নিশ্চিত করে নিন।

অথবা আপনি এটির মতো কিছু করতে পারেন এবং একটি আঘাত দিয়ে সমস্ত কীটপতঙ্গকে মেরে ফেলতে পারেন:

newbob_char <- as.data.frame(lapply(bob[sapply(bob, is.factor)], as.character), stringsAsFactors = FALSE)
newbob_rest <- bob[!(sapply(bob, is.factor))]
newbob <- cbind(newbob_char, newbob_rest)

এই জাতীয় কোডে ডেটা স্থানান্তর করা ভাল ধারণা নয় , আমি এটি করতে পারতামsapply অংশটি আলাদাভাবে (আসলে, এটি এর মতো করা অনেক সহজ) তবে আপনি পয়েন্টটি পেয়ে যাবেন ... আমি কোডটি পরীক্ষা করে দেখিনি, কারণ আমি বাড়িতে নেই, তাই আমি আশা করি এটি কার্যকর! =)

এই পদ্ধতির অবশ্য একটি খারাপ দিক রয়েছে ... আপনার অবশ্যই কলামগুলি পরে পুনর্গঠিত করতে হবে, যখন transformআপনি যা চান তা করতে পারেন তবে "পথচারী-স্টাইল-কোড-রাইটিং" ব্যয় করে ...

সুতরাং সেখানে ... =)


6

আপনার ডেটা ফ্রেমের শুরুতে stringsAsFactors = FALSEসমস্ত ভুল বোঝাবুঝি উপেক্ষা করা অন্তর্ভুক্ত ।


4

আপনি যদি data.tableডেটা.ফ্রেমে অপারেশনের জন্য প্যাকেজ ব্যবহার করেন তবে সমস্যাটি উপস্থিত নেই।

library(data.table)
dt = data.table(col1 = c("a","b","c"), col2 = 1:3)
sapply(dt, class)
#       col1        col2 
#"character"   "integer" 

আপনার যদি ইতিমধ্যে ডেটাसेटে কোনও ফ্যাক্টর কলাম থাকে এবং আপনি এগুলিকে অক্ষরে রূপান্তর করতে চান তবে নিম্নলিখিতগুলি করতে পারেন।

library(data.table)
dt = data.table(col1 = factor(c("a","b","c")), col2 = 1:3)
sapply(dt, class)
#     col1      col2 
# "factor" "integer" 
upd.cols = sapply(dt, is.factor)
dt[, names(dt)[upd.cols] := lapply(.SD, as.character), .SDcols = upd.cols]
sapply(dt, class)
#       col1        col2 
#"character"   "integer" 

ডিটি ম্যারেকের প্রস্তাবিত নীলকণ্ঠিত ফিক্সকে বাতিল করে দেয়: In [<-.data.table(*tmp*, sapply(bob, is.factor), : Coerced 'character' RHS to 'double' to match the column's type. Either change the target column to 'character' first (by creating a new 'character' vector length 1234 (nrows of entire table) and assign that; i.e. 'replace' column), or coerce RHS to 'double' (e.g. 1L, NA_[real|integer]_, as.*, etc) to make your intent clear and for speed. Or, set the column type correctly up front when you create the table and stick to it, please.ডিএফ ঠিক করা এবং ডিটি পুনরায় তৈরি করা সহজ easier
ম্যাট চেম্বারস

2

এটি আমার পক্ষে কাজ করে - অবশেষে আমি একটি লাইনার পেয়েছি

df <- as.data.frame(lapply(df,function (y) if(class(y)=="factor" ) as.character(y) else y),stringsAsFactors=F)


2

নতুন কোন বিকল্প হতে পারে?

library("tidyverse")

bob <- bob %>% group_by_if(is.factor, as.character)

1

আপনি ব্যবহার করা উচিত convertমধ্যে hablarযা দিয়ে পাঠযোগ্য সিনট্যাক্স সামঞ্জস্যপূর্ণ দেয় tidyverseপাইপ:

library(dplyr)
library(hablar)

df <- tibble(a = factor(c(1, 2, 3, 4)),
             b = factor(c(5, 6, 7, 8)))

df %>% convert(chr(a:b))

যা আপনাকে দেয়:

  a     b    
  <chr> <chr>
1 1     5    
2 2     6    
3 3     7    
4 4     8   

1

সঙ্গে dplyr-package লোড ব্যবহার

bob=bob%>%mutate_at("phenotype", as.character)

আপনি যদি phenotypeবিশেষভাবে কলামটি পরিবর্তন করতে চান তবে ।


0

এটি সমস্তকে অক্ষরে এবং তারপরে অঙ্ককে সংখ্যাসূচক রূপান্তরিত করে:

makenumcols<-function(df){
  df<-as.data.frame(df)
  df[] <- lapply(df, as.character)
  cond <- apply(df, 2, function(x) {
    x <- x[!is.na(x)]
    all(suppressWarnings(!is.na(as.numeric(x))))
  })
  numeric_cols <- names(df)[cond]
  df[,numeric_cols] <- sapply(df[,numeric_cols], as.numeric)
  return(df)
}

থেকে অভিযোজিত: কলামের ধরণের এক্সেল শীট স্বয়ংক্রিয়ভাবে পান

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