假设一个数据框如下:
data <- data.frame('obs' = c('a','c','b'), 'top1' = c('a','b','c'), 'top2' = c('b', 'c', 'f'), 'top3' = c('g', 'h', 'd'))
我要计算一个新列topn
,这是一个以下列方式工作的条件:如果obs
的值在任何top
列中,那么{{1应该等于topn
,否则可以为obs
分配任何值,比如说topn
。当然我知道我可以使用top1
和or
执行此操作,但我正在寻找更短的编写方式,因为在我的表格中我最多可以有10 {{1} }列。
ifelse
答案 0 :(得分:2)
如果我们正在寻找矢量化方法,那么我们可以使用逻辑rowSums
上的matrix
来查找是否存在任何匹配项,然后使用ifelse
获取基于列的值在逻辑vector
i1 <- data[-1] == data['obs'][col(data[-1])]
data$topn <- ifelse(rowSums(i1) != 0, as.character(data$obs), as.character(data$top1))
data$topn
#[1] "a" "c" "c"
答案 1 :(得分:1)
这可能会有所帮助,也很快。
f=function(a){
if(a[1] %in% a[-1]){
return (a[1])
}
else{sample(a[-1],1)}
}
data$topn=apply(data,1,f)