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

时间:2018-04-09 22:31:11

标签: r dplyr plyr tidyr

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

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

这是我的代码:

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

我想以这样一种方式调整它:如果用户输入(X的值)没有出现在A列中,则为B列返回该值和NA。

示例:

A  B
1  A12
2  F1222

如果X的值是1,5,我希望输出看起来像这样 -

1 A12
5 NA

2 个答案:

答案 0 :(得分:2)

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

现在,有任何匹配的行使用matched值来返回相应的行。否则,为NA创建一个B值的行。

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)

答案 1 :(得分:1)

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>