r - 在 R 中使用匹配和应用

标签 r match apply

> df = data.frame(id = 1:5, ch_1 = 11:15,ch_2= 10:14,selection = c(11,13,12,14,12))
> df
  id ch_1 ch_2 selection
1  1   11   10        11
2  2   12   11        13
3  3   13   12        12
4  4   14   13        14
5  5   15   14        12

鉴于此数据集,我需要一个遵循规则的附加列:
  • 如果选择是两个选择(ch_1 和 ch_2)之一,则返回选择的编号(1 或 2)
  • 如果选择的不是这两个选项,则返回 3

  • 我需要一种方法来为每一行执行此操作。对于单行,执行以下代码可以正常工作,但我似乎找不到将它与 apply 一起使用的方法将其运行到数据帧的每一行。寻找一种可以应用于多于两列且运行速度比执行传统循环更快的解决方案
    df=df[1,]
    
    if (df$selection %in% df[,paste("ch_",1:2,sep="")]) {
      a = which(df[,paste("ch_",1:2,sep="")]==df$selection)
    } else {
      a = 3
    }
    # OR
    ifelse(df$selection %in% df[,paste("ch_",1:2,sep="")],1,3)
    # OR
    match(df$selection,df[,paste("ch_",1:2,sep="")])
    

    最佳答案

    使用 == 将向量与其他列进行比较, 添加最后一列总是 TRUE ,然后取第一个 TRUE 的索引在每一行中使用 max.col

    max.col(cbind(df$selection == df[c("ch_1","ch_2")], TRUE), "first")
    #[1] 1 3 2 1 3
    

    这应该很容易扩展到 n 列。

    关于r - 在 R 中使用匹配和应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59166078/

    相关文章:

    python - Python 中的 Mclust (R) 等效包

    r - 如何避免R自动将日期转换为数字?

    r - 在 R 中向绘图添加新曲线时调整 x 和 y 轴的限制

    python - 将字典展开到 DataFrame 中,然后添加到原始 DataFrame 中,并添加新列和复制的原始数据

    r - apply() 很慢 - 如何使它更快或我的替代方案是什么?

    r - 在 R 中将字符链作为带有参数的函数进行计算

    python - 正则表达式仅用于字符串中的数字?

    elasticsearch - 检查数组是否包含 Elasticsearch 中具有特定字段的对象?

    java - 正则表达式以某种方式组合 AND 操作数、NOT 操作数和捕获组

    python - 在整个数据帧中,字符串列中的数字表达式中的自定义转换 '%' 和 '>'