[英]Convert a factor column with numbers in k format into numeric without losing any data
我有一個包含數字的因子列。 一些數字以 k 格式書寫,例如。 99k, 9.25k, 91.9k 等,而其他人則像 998、575 等一樣完整地編寫。我想做的兩件事-:
如果我首先將其轉換為數字應用 as.numeric,k 格式數字將成為 NAs。
我想不出什么來解決這個問題。 任何人都可以幫助我解決 r 問題嗎?
以下是樣本數據
df=data.frame(
ID = c(1:8),
Likes = c('99k', '997','15.5k', '9.25k','575', '800', '8.5k', '2,400')
)
編輯我仍然不知道是什么問題。 在嘗試了此處提供的所有解決方案后,仍然生成了 NA。 我正在提供完整數據的鏈接。 請通過它並幫助我找到問題。 我關心的專欄是“喜歡”。
https://drive.google.com/file/d/1tR0F4SwGmsVjh5NGGpONP6LTaqgDOM4l/view?usp=sharing
這是一種替代方法,將帶有 ks 的數字轉換為科學記數法:
df$Likes_num = as.numeric(gsub("k", "e3", df$Likes))
df
ID Likes Likes_num
1 1 99k 99000
2 2 997 997
3 3 15.5k 15500
4 4 9.25k 9250
5 5 575 575
6 6 800 800
7 7 8.5k 8500
編輯以涵蓋整個數據集:
所以你有大寫的 Ks,如 16.1K,大寫的 Ms,如 1.2M,還有逗號,如 4,225。 以下代碼負責所有這些:
df$Likes_num = df$Likes
df$Likes_num = gsub(",", "", df$Likes_num)
df$Likes_num = gsub("K", "e3", df$Likes_num)
df$Likes_num = gsub("M", "e6", df$Likes_num)
df$Likes_num = as.numeric(df$Likes_num)
sum(is.na(df$Likes_num))
## [1] 0
首先檢測哪些記錄帶有“k”。
df$is_k <- grepl("k", df$Likes)
去除“k”,然后轉換為數字。 如果記錄有“k”,則乘以我的 1000,否則乘以 1。
df$Likes_num <- as.numeric(gsub("k", "", df$Likes)) * ifelse(df$is_k, 1000, 1)
對於多個單元,我針對更復雜的問題改編了我在別處擁有的東西。 這顯示了步驟並且足夠簡單,但我不確定它有多健壯。
convert_units <- function(x) {
if (class(x) == "numeric") return(x)
# named vector of scalings (you can add to this)
unit_scale <- c("k" = 1e3, "m" = 1e6)
# clean up some potential nuisances with the input
x_str <- gsub(",", "", trimws(tolower(as.character(x))))
# extract out the letters
unit_char <- gsub("[^a-z]", "", x_str)
# extract out the numbers and convert to numeric
x_num <- as.numeric(gsub("[a-z]", "", x_str), "", x_str)
# develop a vector of multipliers
multiplier <- unit_scale[match(unit_char, names(unit_scale))]
multiplier[is.na(multiplier)] <- 1
# multiply
x_num * multiplier
}
df$Likes2 <- convert_units(df$Likes)
ID Likes Likes2
1 1 99k 99000
2 2 997 997
3 3 15.5k 15500
4 4 9.25k 9250
5 5 575 575
6 6 800 800
7 7 8.5k 8500
8 8 2,400 2400
這種方式假設帶有"k"
的值在更改為數字時將變為NA
,然后更改這些值。
df$LikesNum <- suppressWarnings(as.numeric(as.character(df$Likes)))
df$LikesNum[is.na(df$LikesNum)] <- 1000*as.numeric(as.character(sub("k$", "", df$Likes[is.na(df$LikesNum)])))
這是dplyr
和stringr
df %>%
mutate(Likes_numeric = str_remove(Likes, "k|K"),
Likes_numeric = as.numeric(Likes_numeric),
Likes_numeric = ifelse(str_detect(Likes, "k|K"), Likes_numeric * 1000, Likes_numeric))
ID Likes Likes_numeric
1 1 99k 99000
2 2 997 997
3 3 15.5k 15500
4 4 9.25k 9250
5 5 575 575
6 6 800 800
7 7 8.5k 8500
我查看了您的數據,發現您使用的是K
而不是k
。 對於一般用途,我猜您可以嘗試以下代碼,替換時不區分大小寫
df <- within(df,Likes <- as.numeric(gsub("k", "e3", Likes,ignore.case = TRUE)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.