【问题标题】:I've got an error when I use the modify() and map_int() functions使用 modify() 和 map_int() 函数时出现错误
【发布时间】:2022-11-04 02:53:22
【问题描述】:
id=1:5
age=c(30,30,37,35,33)
gender=c("f","m","f","f","m")
weight=c(155,177,NA,144,199)
height=c(80,34,56,34,98)
SAT=c(100,80,90,70,85)
SAT2=c(105,98,78,34,67)
introvert=c(3,4,NA,2,1)
DF=data.frame(id,age,gender,weight,height,SAT,SAT2,introvert,stringsAsFactors = TRUE)

grade <- function (x) {
  if (x>84){
    "Good"
  } else if (x>75){
    "So So"
  } else {
    "try again"
  }
}

我制作了这个数据框和这个grade() 函数。

map(DF$SAT,grade) 工作正常,但如果我使用 map_int() 或 modify(),它永远不会工作。

map_int(DF$SAT,等级)

错误:

无法将元素 1 从字符强制转换为整数
修改(DF$SAT,等级)
错误:无法将元素 1 从字符强制转换为双精度

问题是什么?

【问题讨论】:

    标签: r purrr


    【解决方案1】:

    问题是后缀 (_int) 应该与返回类型匹配。这里,grade 函数返回 character 而不是 integer 类型。如果我们需要返回character vector,请使用_chr

    library(purrr)
    map_chr(DF$SAT, grade)
    [1] "Good"      "So So"     "Good"      "try again" "Good"  
    

    ?map 文档中提到了它

    map_lgl()、map_int()、map_dbl() 和 map_chr() 返回一个指定类型的原子向量(或尝试).

    关于modify 的错误,它在文档中说明

    与 map() 及其始终返回固定对象类型(map() 的列表、map_int() 的整数向量等)的变体不同,modify() 系列总是返回与输入对象相同的类型.

    因此,它仅在输入和输出具有相同类型时才有效

    > modify(1:6, ~ .x + 1)
    Error: Can't coerce element 1 from a double to a integer
    > modify(1:6, ~ .x + 1L)
    [1] 2 3 4 5 6 7
    > modify(1:6, ~ .x + 1L)
    [1] 2 3 4 5 6 7
    > modify(1:6, ~ as.character(.x))
    Error: Can't coerce element 1 from a character to a integer
    

    【讨论】:

      【解决方案2】:

      我遇到了类似的问题。我的第一个发现是 modify 在数据框而不是矩阵上工作。所以,我尝试了

          modify(DF["SAT"],grade)
      

      我收到错误消息:

          Error in if (x > 84) { : the condition has length > 1
      

      最后我尝试了

          modify(DF["SAT"],~ifelse(. > 84, "Good", ifelse(.>75, "So So", "tru")))
      

      有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-27
        • 1970-01-01
        • 1970-01-01
        • 2020-04-20
        • 2013-05-20
        • 2019-10-05
        • 2022-01-14
        • 2015-08-22
        相关资源
        最近更新 更多