Как создать функцию, в которой пользователь выбирает строки фрейма данных на основе символьного вектора - PullRequest
0 голосов
/ 04 апреля 2019

Мне нужно создать функцию (используя код функции ()), которая позволит пользователю вводить свое имя в виде символа в векторе с именем myname.Функция создаст фрейм данных, который представляет собой подмножество babynames, включая только строки, где name находится в myname.

Я пытался написать код, но часть, которую я не могуПонятно, как функция узнает, что myname будет найдено в столбце names фрейма данных?Я также думал, что правильно сделал подмножество, но когда я запускаю его, у него 0 наблюдений.

Вот некоторые примеры данных

I don't know how to add sample data so here's a picture of the top of the table

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

Ответы [ 3 ]

0 голосов
/ 04 апреля 2019

Я думаю, что вы смотрите по линии чего-то вроде

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()
0 голосов
/ 04 апреля 2019

Как насчет того, чтобы спросить у пользователя его имя, если вы хотите сделать его интерактивным, как,

 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()
0 голосов
/ 04 апреля 2019

Вы можете использовать% в% следующим образом

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)
...