如何获取数据帧中未找到的值的NA

时间:2018-05-09 07:15:20

标签: r dataframe

我有一个值向量和一个数据框,我可以使用以下命令在数据帧的特定列中找到向量的每个项目:

lapply(l, function(x) df[which(df$col1==x),col2])

如何获取我的数据框中没有的值的NA?

例如:

df:   col1  col2
      1     a
      1     b
      2     c

l=c(1,3)

output:  col1   col2
         1      a,b
         3      NA

3 个答案:

答案 0 :(得分:3)

使用data.table,您可以通过运行二进制连接到l(您的向量)来有效地实现此目的

library(data.table)
setDT(df)[.(l), # join between `df` & `l`
          on = .(col1), # using `col1`
          .(col2 = toString(col2)), # paste the values in `col2` (you can add `unique`)
          by = .EACHI] # do this per each value in `l`
#    col1 col2
# 1:    1 a, b
# 2:    3   NA

答案 1 :(得分:1)

数据:

df <- structure(list(col1 = c(1L, 1L, 2L), col2 = c("a", "b", "c")), .Names = c("col1","col2"), class = "data.frame", row.names = c(NA, -3L))
l <- c(1, 3)

<强> CODE:

library(magrittr)
lapply(l, function(x){
    res<-df[[2]][df[[1]]==x] %>% paste(collapse=",")
    if(res=="") res = NA
    return(cbind(x,res))
    }) %>% do.call(rbind,.)

<强>结果:

     x   res  
[1,] "1" "a,b"
[2,] "3" NA  

答案 2 :(得分:0)

如果sth不是整数(0),字符(0)等,则给出TRUE的函数。 (他们的共同点是他们的长度为零):

non.zero.vec <- function(x) length(x) > 0

具有此类零长度值元素的任何向量都可以使用

转换为NA
zero2na <- function(vec) sapply(vec, function(x) ifelse(non.zero.vec(x), x, NA))

## e.g.
zero2na(c(1, 2, integer(0)) ## [1] 1 2 NA

最后,此功能完全符合您的要求:

lookup <- function(df, key.col, val.col, keys) {
  idxs <- lapply(keys, function(x) which(df[, key.col] == x))
  lookups <- lapply(idxs, function(vec) if(length(vec) > 0) {df[vec , val.col]} else {NA})
  lookupstrings <- unlist(lapply(lookups, 
    function(v) suppressWarnings(if(is.na(v)) {"NA"} else {paste(v, collapse = ", ")})))
  res.df <- data.frame(unlist(keys), lookupstrings)
  colnames(res.df) <- c(key.col, val.col)
  res.df
}

df <- data.frame(col1 = c(1,1,2), col2 = c("a", "b", "c"))
lookup(df, "col1", "col2", c(1, 2, 3))

## output:

  col1 col2
1    1 a, b
2    2    c
3    3   NA