我是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列?当我运行代码时,它将打印两次该列,一次打印在末尾,然后是转换后的列。
谢谢您的帮助。
答案 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)