将用户输入映射到数据框,如果在数据框中找不到用户输入,则 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>
我有一个包含两列 "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>