比较每组中的每一行

时间:2016-11-18 15:37:58

标签: r

以下数据集是可重现的

group <- c(1,1,2,2,3,3)
parameter <- c("A","B","A","B","A","B")
values <- c(10,20,20,5,30,50)
df <- data.frame(group,parameter,values)

group parameter values
    1         A     10
    1         B     20
    2         A     20
    2         B      5
    3         A     30
    3         B     50

我想在每组内检查A&gt; B(将此结果存储在整个组的第四列中)

如果是 - >是的,如果没有 - &gt; FALSE

新Df:

group parameter values  status
    1         A     10      FALSE
    1         B     20      FALSE
    2         A     20      TRUE
    2         B      5      TRUE
    3         A     30      FALSE
    3         B     50      FALSE

方法

with(df,ave(values,group,FUN = function(x)))

我无法想到函数内部的代码是什么。有人可以帮助我吗

更新:状态应根据每组的值列(从最高到最低)进行排名

group parameter values  status
    1         A     10      2
    1         B     20      1
    2         A     20      1
    2         B      5      2
    3         A     30      2
    3         B     50      1

2 个答案:

答案 0 :(得分:4)

我们可以尝试使用data.table。将'data.frame'转换为'data.table'(setDT(df)),按'组'分组,比较'参数'为'A'的'值'与'B'的值'和赋值({ {1}})创建“状态”

:=

对于library(data.table) setDT(df)[, status := values[parameter=="A"]>values[parameter=="B"], by = group] df # group parameter values status #1: 1 A 10 FALSE #2: 1 B 20 FALSE #3: 2 A 20 TRUE #4: 2 B 5 TRUE #5: 3 A 30 FALSE #6: 3 B 50 FALSE ,在按“分组”分组后,对“值”使用rank

frank

或者使用setDT(df)[, status:= frank(-values), group] df # group parameter values status #1: 1 A 10 2 #2: 1 B 20 1 #3: 2 A 20 1 #4: 2 B 5 2 #5: 3 A 30 2 #6: 3 B 50 1 ,我们可以将第一个值与第二个值进行比较(假设'参数'是有序的,每个'组'只有两个元素

ave

或者另一种选择是df$status <- with(df, as.logical(ave(values, group, FUN = function(x) x[1] > x[2]))) 数据集由第一列(如果没有排序),子集'值'通过循环逻辑索引,比较和复制每个逻辑值2。

order

答案 1 :(得分:1)

使用if (!(o is int i)) return; // type pattern "int i" if (!(o is int i)) return; // type pattern "int i" 还有tidyverse解决方案:

dplyr