如何删除字符串的一部分并转换数字

时间:2018-12-12 12:41:31

标签: r

我是R的新手,并且对数据框有疑问。

所以我有一个看起来像这样的数据框dataf:

;

然后我使用以下行:

#         PlayerName           playerValue
#5     Tammy Abraham          10,00 Mill. €  
#6     Abdul Rahman Baba      8,00 Mill. €  
#7     Mario Pasalic          8,00 Mill. €  
#8     Lewis Baker            5,50 Mill. €  
#9     Ola Aina               4,00 Mill. €  
#10    Jamal Blackman         500 Th. €  

此输出为:

dataf$playerValue <- gsub(",", ".", gsub("[[:space:]].*", "", dataf$PlayerValue))

反正有没有要使最终值从500到.5?因为显然500,000小于400万,但是这里的int 500将大于4。

此外,如何仅排除原始的PlayerValue列?当我运行代码时,它将打印两次该列,一次打印在末尾,然后是转换后的列。

谢谢您的帮助。

3 个答案:

答案 0 :(得分:1)

这是一个从每个字符串中提取值的想法,如果在字符串中未找到单词MaxInt64,它将除以1000,即

假设数据框,

Mill

然后

 playerName         playerValue
1  Tammy Abraham    10,00 Mill. €
2 Jamal Blackman    500 Th. €

Here is a very similar question,尽管不完全相同

答案 1 :(得分:0)

提取数字时,您可以使用regex来分隔数百万/千。

# dummy data
dataf <- data.frame(playerValue = c("500 Th. € ","4,00 Mill. € "))
# Extract with regex
mils <- 10^3 * as.numeric(gsub("^(\\d+?)\\,(\\d+?)\\s.*|^(\\d+?)\\s.*", "\\1", 
                               dataf$playerValue, perl = TRUE))
thsd <- as.numeric(gsub("^(\\d+?)\\,(\\d+?)\\s.*|^(\\d+?)\\s.*", "\\2\\3", 
                   dataf$playerValue, perl = TRUE))
# Final result
rowSums(cbind(mils, thsd), na.rm = TRUE)
# returns
[1]  500 4000

答案 2 :(得分:0)

使用 strsplit ifelse 这是一个简单的答案。

# Dummy data
df <- data.frame(playerValue = c("500 Th. € ","4,00 Mill. € "), stringsAsFactors = FALSE)

# Splitting number and scale into two columns
splits <- strsplit(df$playerValue, split = " ")
splits <- do.call(rbind, splits)

# Replacing commas
splits[,1] <- gsub(",", ".", splits[,1])

# Adding to dataframe
df$value <- as.numeric(splits[,1])
df$scale <- splits[,2]

# Calculating new values
df$new_value <- ifelse(df$scale == "Th.", df$value/1000, df$value)