【问题标题】:How to create a function where the user picks rows of a data frame based on a character vector如何创建用户根据字符向量选择数据帧行的函数
【发布时间】:2019-04-04 14:36:20
【问题描述】:

我需要创建一个函数(使用 function() 代码),它允许用户在名为 myname 的向量中输入他们的姓名作为字符。该函数将创建一个作为babynames 子集的数据框,仅包括namemyname 中的行。

我尝试编写代码,但我似乎无法理解的部分是:函数如何知道myname 将在数据框的names 列中找到?我还认为我正确地制作了子集,但是当我运行它时,它有 0 个观察值。

这是一些示例数据

nametrend <- function(myname) {
    bn <- subset(babynames, name == myname, select = c("year", "n")) plot(x = bn$year, y = bn$n, main = myname, col = 'purple')
}

【问题讨论】:

  • 您能提供一些示例数据吗?
  • 并展示你是如何调用函数的。或许可以看到并注意?subset 文档中的警告这是一个旨在交互使用的便利功能。对于编程,最好使用像[ 这样的标准子集函数,特别是参数子集的非标准评估可能会产生意想不到的后果。"
  • 好的,我添加了表格前几行的图片。例如,我需要该函数获取名称为“玛丽”的所有行,并按年份绘制该名称的人数。几周前我也刚开始学习 R,所以我不太了解它或您使用的一些单词,哈哈。我将如何使用 [ ?
  • 请使用dput() 分享示例数据,以便可以复制/粘贴。 dput(droplevels(babynames[1:20, ])) 会给我们前 20 行。将其输出编辑到您的问题中。
  • 这也说明了[ 的子集化。 babynames[1:20, ] 是前 20 行。 babynames[babynames$name == "Mary", ] 是名称为“Mary”的所有行。 babynames[babynames$name == "Mary", c("year", "n")] 是名称为 Mary 的行,仅选择年份和 n 列。

标签: r function subset


【解决方案1】:

你可以像这样使用 %in%

year <- 2000:2019
n <- round(rnorm(length(year), 0))
name <- c(rep("alex", 5), rep("ben", 10), rep("mary", 5))
babyname <- data.frame(year, n, name)

myname <- "alex"
bn <- babyname[babyname$name %in% myname, ]
bnl   
  year  n name
1 2000  0 alex
2 2001  1 alex
3 2002 -1 alex
4 2003  2 alex
5 2004 -1 alex

在您的函数内部,并有多个值作为 myname 这将是

nametrend <- function(myname) {
bn <- babyname[babyname$name %in% myname, ]
bn$name <- droplevels(bn$name)
plot(x = bn$year, y = bn$n, main = myname, col = bn$name)
legend("topleft", legend= levels(bn$name), pch=16, col=unique(bn$name))
}

myname <- c("alex", "mary")

nametrend(myname)

【讨论】:

  • 这个方法似乎有效,除了我如何测试这段代码?我试着做 nametrend(Mary) 但它似乎不起作用。我应该在括号内添加更多信息吗?
  • 是的,必须是字符。所以你必须输入“alex”,例如
  • 天哪,它工作得很好!!!!!!你真是天赐之物,非常感谢!!!!!!!
【解决方案2】:

我认为你正在寻找类似的东西

ask_for_names <- function(){
  name_1 <- readline(prompt = "Enter a name: ")
  name_1
  # Probably should add checks to make sure it is valid
  # e.g. as.character(name_1)
}

input_into_next_function <- ask_for_names()

【讨论】:

    【解决方案3】:

    如果你想让它具有交互性,询问用户他们的名字怎么样,

     nametrend <- function(myname = readline("What is your name? ")) {
        bn <- subset(babynames, name == myname, select = c("year", "n")) 
        plot(x = bn$year, y = bn$n, main = myname, col = 'purple')
    }
    nametrend()
    

    【讨论】:

      猜你喜欢
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      相关资源
      最近更新 更多