तो मेरे पास एक डीएफ है जो अंक के बजाय अल्पविराम के रूप में विभाजित संख्यात्मक मानों के साथ ऐसा दिखता है और उन्हें वर्णों के रूप में वर्गीकृत किया जाता है।
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 हैं। उसमें जोड़ा गया है, मेरे पास अतिरिक्त चर हैं जिनमें टेक्स्ट स्ट्रिंग और कारक स्तर शामिल हैं जहां अल्पविराम को परिवर्तित करने की आवश्यकता नहीं है।
इस पर कोई सुझाव?
शुक्रिया
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)
इस तरह की चीज़ के लिए 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]" से मेल खाने वाली किसी भी चीज़ को न्यूमेरिक में बदल दिया है। अल्पविराम के बजाय डेटा और प्रयुक्त बिंदु। आपको अपनी स्थिति के लिए आवश्यकतानुसार उस नियमित अभिव्यक्ति को समायोजित करने की आवश्यकता होगी।