如何清洗r中混合高度单位的色谱柱

2admgd59  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(107)

我的数据框中有一列来自一个调查,其中有两个不同的单位。我需要删除这些,并将信息转换为一个一致的单位,即一列的所有厘米没有单位。
以下是一些示例数据

df <- data.frame(v1 = c('100 cm', '6 foot 10', '200 cm', '5 foot 11')

我尝试使用这个readr::parse_number(df$v1),但这会将“6 foot 10”转换为6。我不确定它是否有帮助,因为我仍然需要将记录为英尺和英寸的高度转换为厘米

py49o6xq

py49o6xq1#

可以按英尺分割字符串('6 foot 10'〉〉c(6, 10)),然后Map所有项,将它们解析为数字,如果它们的长度为2(即字符串分割的结果),则将它们乘以转换率。

library(tidyverse)
df$v1 %>%
  strsplit(" foot ") %>%
  map_dbl(function(num){
    num = parse_number(num)
    if(length(num) == 2) {sum(num * c(30.48, 2.54))} else {num}})

[1] 100.00 208.28 200.00 180.34

另一个选择,但在我看来不太优雅,是使用stringr::str_replace_all'6 foot 10'更改为'6*30.48 + 2.54*10'(将#英尺和#英寸乘以它们的转换率),然后使用eval + parse(使用sapplypurrr::map之类的Map函数,因为这些函数没有矢量化)将这些字符串作为表达式进行计算。

df$v1 %>%
  str_replace_all(c(" cm" = "", " foot " = "*30.48 + 2.54*")) %>%
  map_dbl(~ parse(text = .x) %>% eval())

[1] 100.00 208.28 200.00 180.34
lstz6jyr

lstz6jyr2#

也许是这样的(与tidyverse):

df %>%  mutate(
  units = case_when(
    str_detect(v1, ".cm") ~ "cm",
    str_detect(v1, ".foot") ~ "foot"
  )
)

然后,您将得到一个单位列,并基于该列应用转换因子。

相关问题