以下数据集是可重现的
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
答案 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