【问题标题】:Determine R Data Frame Row Values from Column Value Comparison从列值比较中确定 R 数据框行值
【发布时间】:2016-07-09 14:53:49
【问题描述】:

我正在尝试比较 C 列中的值并返回与它们关联的行。一个示例是比较 C 列中的前两个值。如果第一个值大于第二个值,则返回数据框中的前两行。如果第一个值不大于则跳到下一组,并比较并查看 C 列中的第三个值是否大于第四个。如果是这种情况,则返回第 3 行和第 4 行。如果没有,则跳到下一组。

我一直在与 dplyrfilter 函数争吵,但没有运气。

下面是一个示例数据框。

set.seed(99)
DF <- data.frame(abs(rnorm(10)), abs(rnorm(10)), abs(rnorm(10)))
colnames(DF) <-c("A", "B", "C")
DF

任何帮助将不胜感激。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    您可以使用zoo 包中的rollapply

    library(zoo)
    ind <- rep(rollapply(DF$C, 2, by = 2, which.max) == 1, each = 2)
    DF[ind,]
                A         B          C
    #1  1.52984334 2.0127251 1.70922539
    #2  1.96454540 0.2887642 0.52301701
    #5  1.15765833 0.2866493 1.72702076
    #6  0.80379719 1.0945894 0.72269558
    #7  1.52239099 0.5296913 2.04080511
    #8  0.01663749 0.3593682 0.88601771
    #9  0.12672258 0.4110257 0.19165526
    #10 0.27740770 0.1950477 0.01378397
    

    【讨论】:

      【解决方案2】:

      这是一个基本的R 解决方案,您可以尝试在其中根据条件找到每两行的索引,然后对数据框执行子集:

      ind <- which(DF$C[c(T, F)] > DF$C[c(F, T)])  # check whether the odd rows are larger than
      # the even rows and find out the index
      DF[c(2*ind-1, 2*ind), ]   # subset the data frame based on index for every two rows
      #            A         B         C
      # 1  1.6866933 0.6886403 1.1231086
      # 9  0.8781335 2.1689560 1.3686023
      # 2  0.8377870 0.5539177 0.4028848
      # 10 0.8215811 1.2079620 0.2257710
      

      【讨论】:

      • rollapply() 函数似乎最适合我的应用程序。原因是我需要将其扩展到更大的运行窗口并定义不同的标准以返回指定的行。我可以定义自己的函数并替换 which.max 来定义它返回的内容。
      猜你喜欢
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      • 2017-03-08
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      相关资源
      最近更新 更多