如何将变量名称作为在r中找到匹配的值

时间:2017-07-13 18:08:38

标签: r

我在r

中有一个向量
a <- c(1,2,3,4)
b <- c(2,3,4,5)
c <- c(5,6,7,8)
d <- c(10,11)

我在r。

中有以下数据框
No
1
2
3
4
5
6 
7
8
10
11 

我想要的数据框如下

No     Match
1       a
2       a
3       a
4       a  
5       b
6       c
7       c
8       c
10      d
11      d

我怎样才能在r?

中这样做

2 个答案:

答案 0 :(得分:1)

构建表格后我们可以使用match。如果您的向量在列表中开始将很容易:

vec_list = list(a = a, b = b, c = c, d = d)
x = data.frame(value = unlist(vec_list), letter = rep(names(vec_list), lengths(vec_list)))

# or a named vector
xx = unlist(vec_list)
names(xx) = rep(names(vec_list), lengths(vec_list))


your_data = data.frame(No = 1:8)
your_data$Match = x$letter[match(your_data$No, x$value)]
your_data$Match_vec = names(xx)[match(your_data$No, xx)]
your_data
#    No Match Match_vec
# 1  1     a         a
# 2  2     a         a
# 3  3     a         a
# 4  4     a         a
# 5  5     b         b
# 6  6     c         c
# 7  7     c         c
# 8  8     c         c

我们也可以对x表进行重复数据删除或多或少相同的结果

x[!duplicated(x$value), ]

如果没有背景,很难知道哪种情况最适合你的情况。

答案 1 :(得分:0)

我创建了两个可以帮助您获得正确变量名称的函数。这是我的解决方案。

getVariable <- function(x){
  for(currentVar in ls(envir = .GlobalEnv)){
    if(class(get(currentVar)) == "numeric") if(x %in% get(currentVar)) return(currentVar)
  }
  return(NA)
}

getAll <- function(y){
  myList <- c()
  for(values in y){
    myList <- c(myList,getVariable(values))
  }
  return(myList)
}
a <- c(1,2,3,4)
b <- c(2,3,4,5)
c <- c(5,6,7,8)
d <- c(10,11)
myDat <- structure(list(No = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 10L, 11L
)), .Names = "No", row.names = c(NA, -10L), class = "data.frame")
myDat$Match <- getAll(myDat$No)
myDat
# No Match
# 1   1     a
# 2   2     a
# 3   3     a
# 4   4     a
# 5   5     b
# 6   6     c
# 7   7     c
# 8   8     c
# 9  10     d
# 10 11     d