簡體   English   中英

將帶有k格式數字的因子列轉換為數字而不丟失任何數據

[英]Convert a factor column with numbers in k format into numeric without losing any data

我有一個包含數字的因子列。 一些數字以 k 格式書寫,例如。 99k, 9.25k, 91.9k 等,而其他人則像 998、575 等一樣完整地編寫。我想做的兩件事-:

  • 我想將具有 k 的數字乘以 1000 並刪除 k。
  • 我想將此列轉換為數字列而不丟失任何數據。

如果我首先將其轉換為數字應用 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)])))

這是dplyrstringr

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM