我有一个值向量和一个数据框,我可以使用以下命令在数据帧的特定列中找到向量的每个项目:
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
答案 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
具有此类零长度值元素的任何向量都可以使用
转换为NAzero2na <- 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