error when applying functions like replace_na() from tidyr on labelled columns of dataframe in R

huangapple go评论96阅读模式
英文:

error when applying functions like replace_na() from tidyr on labelled columns of dataframe in R

问题

当我尝试在带标签的列上应用函数时,出现以下错误。这里以应用mean()函数为例。

  1. library(tidyr)
  2. library(dplyr)
  3. library(Hmisc)
  4. df <- data.frame(a = LETTERS[1:5],
  5. b = c(1,2,NA,4,5))
  6. Hmisc::label(df$a) <- "hi hi"
  7. Hmisc::label(df$b) <- "bye bye"
  8. names(df) <- Hmisc::label(df)
  9. df %>%
  10. mutate(`hi hi` = paste0(`hi hi`, "people"),
  11. `bye bye` = replace_na(`bye bye`, mean(`bye bye`, na.rm = T)))
  12. #mean(df$`bye bye`, na.rm = T)

错误信息为:

  1. Error in `mutate()`:
  2. In argument: `bye bye = replace_na(`bye bye`, mean(`bye bye`, na.rm = T))`.
  3. Caused by error in `vec_assign()`:
  4. ! Can't convert `replace` <double> to match type of `data` <labelled>.
  5. Backtrace:
  6. 1. df %>% ...
  7. 10. tidyr:::replace_na.default(`bye bye`, mean(`bye bye`, na.rm = T))
  8. 11. vctrs::vec_assign(data, missing, replace, x_arg = "data", value_arg = "replace")
  9. Error in mutate(., `hi hi` = paste0(`hi hi`, "people"), `bye bye` = replace_na(`bye bye`, :
  10. Caused by error in `vec_assign()`:
  11. ! Can't convert `replace` <double> to match type of `data` <labelled>.
英文:

I get error below when I want to apply a function on the labelled columns. here as an example I applied mean() function.

  1. library(tidyr)
  2. library(dplyr)
  3. library(Hmisc)
  4. df &lt;- data.frame(a = LETTERS[1:5],
  5. b = c(1,2,NA,4,5))
  6. Hmisc::label(df$a) &lt;- &quot;hi hi&quot;
  7. Hmisc::label(df$b) &lt;- &quot;bye bye&quot;
  8. names(df) &lt;- Hmisc::label(df)
  9. df %&gt;%
  10. mutate(`hi hi` = paste0(`hi hi`, &quot;people&quot;),
  11. `bye bye` = replace_na(`bye bye`, mean(`bye bye`, na.rm = T)))
  12. #mean(df$`bye bye`, na.rm = T)

The error is:

  1. Error in `mutate()`:
  2. In argument: `bye bye = replace_na(`bye bye`, mean(`bye bye`, na.rm = T))`.
  3. Caused by error in `vec_assign()`:
  4. ! Can&#39;t convert `replace` &lt;double&gt; to match type of `data` &lt;labelled&gt;.
  5. Backtrace:
  6. 1. df %&gt;% ...
  7. 10. tidyr:::replace_na.default(`bye bye`, mean(`bye bye`, na.rm = T))
  8. 11. vctrs::vec_assign(data, missing, replace, x_arg = &quot;data&quot;, value_arg = &quot;replace&quot;)
  9. Error in mutate(., `hi hi` = paste0(`hi hi`, &quot;people&quot;), `bye bye` = replace_na(`bye bye`, :
  10. Caused by error in `vec_assign()`:
  11. ! Can&#39;t convert `replace` &lt;double&gt; to match type of `data` &lt;labelled&gt;.

答案1

得分: 1

replace_nabye bye 的数据类型似乎有冲突;这里 bye bye 可能需要是数值型的:

  1. library(dplyr)
  2. df |&gt;
  3. mutate(`hi hi` = paste0(`hi hi`, &quot;people&quot;),
  4. `bye bye` = as.numeric(`bye bye`),
  5. `bye bye` = replace_na(`bye bye`, mean(`bye bye`, na.rm = T)))

不过你也可以考虑使用 base 的方法:

  1. is.na(df$`bye bye`) &lt;- mean(df$`bye bye`, na.rm = TRUE)

输出:

  1. hi hi bye bye
  2. 1 Apeople 1
  3. 2 Bpeople 2
  4. 3 Cpeople 3
  5. 4 Dpeople 4
  6. 5 Epeople 5
英文:

The type seems to conflict with replace_na; here bye bye probably need to be numeric:

  1. library(dplyr)
  2. df |&gt;
  3. mutate(`hi hi` = paste0(`hi hi`, &quot;people&quot;),
  4. `bye bye` = as.numeric(`bye bye`),
  5. `bye bye` = replace_na(`bye bye`, mean(`bye bye`, na.rm = T)))

However you might also consider going the base way:

  1. is.na(df$`bye bye`) &lt;- mean(df$`bye bye`, na.rm = TRUE)

Output:

  1. hi hi bye bye
  2. 1 Apeople 1
  3. 2 Bpeople 2
  4. 3 Cpeople 3
  5. 4 Dpeople 4
  6. 5 Epeople 5

huangapple
  • 本文由 发表于 2023年3月3日 23:07:36
  • 转载请务必保留本文链接:https://go.coder-hub.com/75628750.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定