我怎样才能让我的函数访问这个 Dataframe 中的变量?

w41d8nur  于 2023-01-18  发布在  其他
关注(0)|答案(2)|浏览(165)

考虑到下面的数据库(称为data),我想创建一个函数来检索给定“Letter”的第一个“Start”位置。我想让我的函数将 Dataframe 和Letter作为输入。我想在不使用库的情况下完成这一操作。
| 信件|开始|完|
| - ------|- ------|- ------|
| A类|1个|第二章|
| A类|三个|三个|
| A类|第二章|四个|
| B|四个|五个|
| B|六个|1个|
| B|第二章|六个|
| C级|四个|八个|
| C级|九|三个|
| C级|七|三个|
我认为第一步应该是子集化特定的“字母”,我想得到的“开始”的立场:
newdata <- subset(data, data == "A")
这产生了字母A特定的 Dataframe :
| 信件|开始|完|
| - ------|- ------|- ------|
| A类|1个|第二章|
| A类|三个|三个|
| A类|第二章|四个|
第二步应为第一个起始位置的子集化 Dataframe 编制索引:
newdata[1,2]输出:1
它的工作,因此我做了一个函数的基础上,上述步骤,其中x是一个命名的 Dataframe 和y是变量选择:
getFirstLetter <- function(x, y){ newdata <- subset(x, x == "y") return(newdata[1,2]) }
测试功能,但得到NA:getFirstLetter(data, A)输出:不适用
故障排除代码:getFirstLetter(data, "A")输出:不适用
我希望能得到一些指导,解释为什么我的函数没有返回预期的输出。谢谢。

zaqlnxep

zaqlnxep1#

您可以使用as.character(substitute())

getFirstLetter <- function(x, y) { 
  y <- as.character(substitute(y))
  newdata <- subset(x, Letter == y)
  newdata[1,2]
}

getFirstLetter(data, A)
# 1

一种稍微简洁一点的方法是使用match()索引到x中:

getFirstLetter <- function(x, y) { 
  y <- as.character(substitute(y))
  x[[match(y, x$Letter), "Start"]]
}
jhiyze9q

jhiyze9q2#

library(tibble)

df <- tibble::tribble(
  ~Letter, ~Start, ~End,
      "A",     1L,   2L,
      "A",     3L,   3L,
      "A",     2L,   4L,
      "B",     4L,   5L,
      "B",     6L,   1L,
      "B",     2L,   6L,
      "C",     4L,   8L,
      "C",     9L,   3L,
      "C",     7L,   3L
  )
getFirstLetter <-  function(df, letter){
  newdata <- subset(df, Letter == letter)[1,2] 
  return(newdata) 
}

getFirstLetter(df = df, letter = "A")

相关问题