数据框筛选多行条件

3

假设有一个数据框如下:

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列中,则topn应该等于obs,否则topn可以被赋予任何值,比如说top1。当然我知道我可以用orifelse来实现这个目的,但我正在寻找一种更短的写法,因为在我的表格中我最多可以有10个top列。

 obs top1 top2 top3 topn
   a    a    b    g  a
   c    b    c    h  c
   b    c    f    d  c

如果obs是第一列并且其他所有列都是'top',则这可能很好。data $ topn = data [cbind(1:nrow(data),apply(data,1,function(x)1 +!(x [1]%in% x [-1])))] - Pierre L
2个回答

2

如果我们正在寻找一种向量化的方法,那么我们可以在逻辑矩阵上使用 rowSums 来查找是否有任何匹配项,然后使用 ifelse 根据逻辑向量获取列值。

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
这可能会很有帮助且快速。
f=function(a){

如果a的第一个元素在除了第一个元素以外的其他元素中出现,则执行以下代码:
    return (a[1])
  }

否则{sample(a[-1],1)}

}

data$topn=apply(data,1,f)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接