将用户输入映射到数据框,如果在数据框中找不到用户输入,则 return NA

Map user input to a data frame and return NA if the user input is not found in the data frame

我有一个包含两列 "A" 和 "B" 的数据框。我创建了一个如下所述的函数:

如果在 A 列中找到 X(用户输入的值),则 return 在 A 列中找到的 X 值及其在 B 列中的对应值。

这是我的代码:

myfunction <- function(x) {
  r<- with(my_dataframe, my_dataframe[A %in% x, c("A", "B")])
  return(data.frame(r))
}

我想以这样的方式进行调整,即如果用户输入(X 的值)未出现在 A 列中,return 该值和 B 列中的 NA。

示例:

A  B
1  A12
2  F1222

如果 X 的值为 1、5。我希望输出如下所示 --

1 A12
5 NA

一种方法可能是首先使用条件 matched = my_dataframe$A==x 找到 matched rows

现在,找到使用 matched 值到 return 对应行的任何匹配行。否则,为 B 创建一个值为 NA 的行。

myfunction <- function(x) {
  r <- data.frame()
  matched = my_dataframe$A %in% x
  if(sum(matched) > 0){
      r<- with(my_dataframe, my_dataframe[matched, c("A", "B")])
  } else{
      r<-data.frame(A = x, B = NA)
  } 
  return(r)
}

#Test
myfunction(2)
#   A   B
# 2 2 A34
myfunction(11)
#    A  B
# 1 11 NA

已编辑: 根据 OP 的最新反馈,我认为 dplyr::left_join 会为他解决问题:

a <- 1
dplyr::left_join(data.frame(A=a), my_dataframe, by="A")
#   A   B
# 1 1 A21


a <- c(2,3,12,34,45)
dplyr::left_join(data.frame(A=a), my_dataframe, by="A")
#    A    B
# 1  2  A34
# 2  3 D345
# 3 12 <NA>
# 4 34 <NA>
# 5 45 <NA>

数据

my_dataframe <- data.frame(A = 1:4, 
              B=c("A21", "A34", "D345", "E45"), stringsAsFactors = FALSE)
myfunction <- function(x) {
   r<- with(my_dataframe, my_dataframe[A %in% x, c("A", "B")])
   if(!nrow(r)) data.frame(A=x,B=NA) else data.frame(r)
 }
> myfunction(3)
  A  B
1 3 NA
> myfunction(2)
  A     B
2 2 F1222

编辑以允许矢量:

my=function(x){
  s=subset(data,A==x)
  m=x%in%s$A
  if(all(m)) s else   rbind(s,cbind(A=x[!m],B=NA))
}

 my(1)
  A   B
1 1 A12
> my(1:10)
    A     B
1   1   A12
2   2 F1222
3   3  <NA>
4   4  <NA>
5   5  <NA>
6   6  <NA>
7   7  <NA>
8   8  <NA>
9   9  <NA>
10 10  <NA>
> my(4)
  A  B
1 4 NA

my(c(1,3.11))
     A    B
1 1.00  A12
2 3.11 <NA>