数据帧条件多行

时间:2017-11-15 02:58:43

标签: r dataframe

假设一个数据框如下:

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。当然我知道我可以使用top1or执行此操作,但我正在寻找更短的编写方式,因为在我的表格中我最多可以有10 {{1} }列。

ifelse

2 个答案:

答案 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)