【问题标题】:Apply function to dataframe with changing argument将函数应用于具有更改参数的数据框
【发布时间】:2015-06-04 19:40:28
【问题描述】:

我有 2 个对象:

具有 3 个变量的数据框:

v1 <- 1:10
v2 <- 11:20
v3 <- 21:30
df <- data.frame(v1,v2,v3)

具有 3 个元素的数值向量:

nv <- c(6,11,28)

我想将第一个变量与第一个数字进行比较,将第二个变量与第二个数字进行比较,依此类推。

which(df$v1 > nv[1])
which(df$v2 > nv[2])
which(df$v3 > nv[3])

当然,实际上我的数据框有更多变量,因此手动输入每个变量不是一种选择。

我经常遇到这类问题。我需要阅读什么样的文档才能熟练掌握这些问题?

【问题讨论】:

    标签: r apply


    【解决方案1】:

    一种选择是与同样大小的元素进行比较。为此,我们可以通过 'df' (rep(nv, each=nrow(df))) 的行数复制 'nv' 中的每个元素,并与df 进行比较,或者使用与rep 执行类似输出的col 函数。

     which(df > nv[col(df)], arr.ind=TRUE)
    

    如果你需要一个逻辑矩阵,对应于每列与'nv'的每个元素的比较

     sweep(df, 2, nv, FUN='>')
    

    【讨论】:

    • 非常感谢。顺便说一句,所有这些都是很好的答案。
    【解决方案2】:

    你也可以使用mapply:

    mapply(FUN=function(x, y)which(x > y), x=df, y=nv)
    #$v1
    #[1]  7  8  9 10
    #
    #$v2
    #[1]  2  3  4  5  6  7  8  9 10
    #
    #$v3
    #[1]  9 10
    

    【讨论】:

      【解决方案3】:

      我认为这类情况很棘手,因为正常的循环解决方案(例如 apply 函数)仅循环通过一个对象,但您需要同时循环通过 dfnv。一种方法是遍历索引并使用它们从dfnv 中获取适当的信息。循环索引的一种便捷方法是 sapply 函数:

      sapply(seq_along(nv), function(x) which(df[,x] > nv[x]))
      # [[1]]
      # [1]  7  8  9 10
      # 
      # [[2]]
      # [1]  2  3  4  5  6  7  8  9 10
      # 
      # [[3]]
      # [1]  9 10
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-30
        • 1970-01-01
        相关资源
        最近更新 更多