तो मेरे पास एक डीएफ है जो अंक के बजाय अल्पविराम के रूप में विभाजित संख्यात्मक मानों के साथ ऐसा दिखता है और उन्हें वर्णों के रूप में वर्गीकृत किया जाता है।

var0 <- c("There, are commas", "in the text, string", "as,well", "how, can", "i", "fix, this", "thank you")
var1 <- c("50,0", "72,0", "960,0", "1.920,0", "50,0", "50,0", "960,0")
var2 <- c("40,0", "742,0", "9460,0", "1.920,0", "50,0", "50,0", "960,0")
var3<- c("40,0", "72,0", "90,0", "1,30", "50,0", "50,0", "960,0")
...
var96 <- c("40,0", "742,0", "9460,0", "1.920,0", "50,0", "50,0", "960,0")

df <- data.frame(cbind(var0, var1, var2, var3))

मैं जानता हूं कि प्रत्येक चर को मैन्युअल रूप से gsub का उपयोग करके कैसे परिवर्तित किया जाए, लेकिन जैसा कि आप नीचे देख सकते हैं मेरे पास इनमें से लगभग 96 हैं। उसमें जोड़ा गया है, मेरे पास अतिरिक्त चर हैं जिनमें टेक्स्ट स्ट्रिंग और कारक स्तर शामिल हैं जहां अल्पविराम को परिवर्तित करने की आवश्यकता नहीं है।

इस पर कोई सुझाव?

शुक्रिया

1
bolleke 22 अक्टूबर 2020, 18:39

2 जवाब

सबसे बढ़िया उत्तर

यहां एक फ़ंक्शन है जो केवल अल्पविराम को दशमलव अवधियों से बदल देता है और अन्य सभी बिंदुओं को हटा देता है यदि मौजूद सभी वर्ण अंक 0-9, बिंदु और अल्पविराम हैं।

commas2dots <- function(x){
  if(any(grepl("[^\\.,[:digit:]]", x))){
    x
  } else {
    y <- gsub("\\.", "", x)
    tc <- textConnection(y)
    on.exit(close(tc))
    scan(tc, dec = ",", quiet = TRUE)
  }
}

lapply(df, commas2dots)
#$var0
#[1] "There, are commas"   "in the text, string"
#[3] "as,well"             "how, can"           
#[5] "i"                   "fix, this"          
#[7] "thank you"          
#
#$var1
#[1]   50   72  960 1920   50   50  960
#
#$var2
#[1]   40  742 9460 1920   50   50  960
#
#$var3
#[1]  40.0  72.0  90.0   1.3  50.0  50.0 960.0
#
#$var96
#[1]   40  742 9460 1920   50   50  960

Data.frame के कॉलम बदलने के लिए:

df[] <- lapply(df, commas2dots)
df
#                 var0 var1 var2  var3 var96
#1   There, are commas   50   40  40.0    40
#2 in the text, string   72  742  72.0   742
#3             as,well  960 9460  90.0  9460
#4            how, can 1920 1920   1.3  1920
#5                   i   50   50  50.0    50
#6           fix, this   50   50  50.0    50
#7           thank you  960  960 960.0   960

डेटा

var0 <- c("There, are commas", "in the text, string", "as,well", "how, can", "i", "fix, this", "thank you")
var1 <- c("50,0", "72,0", "960,0", "1.920,0", "50,0", "50,0", "960,0")
var2 <- c("40,0", "742,0", "9460,0", "1.920,0", "50,0", "50,0", "960,0")
var3<- c("40,0", "72,0", "90,0", "1,30", "50,0", "50,0", "960,0")
var96 <- c("40,0", "742,0", "9460,0", "1.920,0", "50,0", "50,0", "960,0")

df <- data.frame(var0, var1, var2, var3, var96)
0
Rui Barradas 22 अक्टूबर 2020, 18:55

इस तरह की चीज़ के लिए tidyverse पैकेज अच्छा है।

library(tidyverse)
df <- df %>% 
      # First, remove the points in your numbers b/c otherwise, you'll end up
      # with, e.g., "1.920.0"
      mutate_all(.fun = function(x) gsub("\\.", "", x)) %>% 
      # Next, replace all the commas with points and convert to numeric. Only do
      # this for the columns that don't contain text, though.
      mutate_at(.vars = vars(matches("var[1-3]")), 
                .fun = function(x) as.numeric(gsub(",", "\\.", x)))

कृपया ध्यान दें कि, mutate_at कॉल में, मैंने मान लिया था कि केवल कॉलम "var0" में वह टेक्स्ट है जिसे आप बनाए रखना चाहते हैं और मैंने रेगुलर एक्सप्रेशन "var[1-3]" से मेल खाने वाली किसी भी चीज़ को न्यूमेरिक में बदल दिया है। अल्पविराम के बजाय डेटा और प्रयुक्त बिंदु। आपको अपनी स्थिति के लिए आवश्यकतानुसार उस नियमित अभिव्यक्ति को समायोजित करने की आवश्यकता होगी।

0
shirewoman2 22 अक्टूबर 2020, 18:55