Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据值的第一次出现在组中选择一行_R_Select - Fatal编程技术网

R 根据值的第一次出现在组中选择一行

R 根据值的第一次出现在组中选择一行,r,select,R,Select,这个问题比我昨天问的问题更进一步 我想在组中查找第一次出现定义数字的行。如果此数字未出现在组中,则将使用下一个最高数字 例如: group <- c("a", "a", "a", "a", "b", "b", "b", "b", "c", "c", "c", "c") value <- c(1, 3, 2, 1, 1, 1, 2, 1, 2, 3, 3, 2) GOAL <- c("FALSE", "TRUE", "FALSE", "FALSE", "FALSE", "FALS

这个问题比我昨天问的问题更进一步

我想在组中查找第一次出现定义数字的行。如果此数字未出现在组中,则将使用下一个最高数字

例如:

group <- c("a", "a", "a", "a", "b", "b", "b", "b", "c", "c", "c", "c")
value <- c(1, 3, 2, 1, 1, 1, 2, 1, 2, 3, 3, 2)
GOAL <- c("FALSE", "TRUE", "FALSE", "FALSE", "FALSE", "FALSE", "TRUE", "FALSE", "FALSE", "TRUE", "FALSE", "FALSE")
data <- data.frame(group, value, GOAL)
data

group你可以通过将我给你最后一个问题的答案中的
which(v==2)[1]
替换为
which.max(v)
来获得你描述的结果

f尝试以下代码片段:

 groups<-c("a", "a", "a", "a", "b", "b", "b", "b", "c", "c", "c", "c");
 values<-c(1, 3, 2, 1, 1, 1, 2, 1, 2, 3, 3, 2);
 dFrame<-data.frame(groups,values);

 max_values<-as.vector(unlist(tapply(dFrame$values,dFrame$groups,max)));
 length_values<-as.vector(unlist(tapply(dFrame$values,dFrame$groups,length)));

 dFrame$GOAL<-as.vector(unlist(sapply(1:length(max_values),FUN=function(i,x,y,z){
   v<-rep(FALSE,z[i]);
   ind<-match(y[i],as.vector(unlist(x[i])));
   v[ind]<-TRUE;
   return (v);
   },x=tapply(dFrame$values,dFrame$groups,identity),
   y=max_values,z=length_values)));

组或在基本包装中,类似于@MatthewPlourde溶液,但有一个衬里:

transform(data, GOAL= ave(value,group,
        FUN=function(x)seq(x)==which.max(x))> 0)
编辑获取最后一个最大值

which.max
确定第一个最大值的位置。它相当于
head(其中(x==max(x)),1)
。要获得最后一个最大值,可以执行以下操作:

transform(data, GOAL= ave(value,group,
                          FUN=function(x)seq(x)==tail(which(x==max(x)),1))> 0)

如果您显示当前数据帧(
数据
),然后显示您希望它的外观,则更容易提供帮助。您的描述与您作为示例给出的“目标”不一致。组“c”包含一个3。所以c组的目标应该是c(“假”、“真”、“假”、“假”);这是因为你说“如果组中没有数字3,那么寻找第一个数字2,依此类推”……这个问题是可以理解的。请注意,目标栏是预期的结果。阿迪蒂亚和阿格斯蒂克,谢谢。我已经编辑了这个问题。我认为这不太正确。我的理解是OP只希望第一个最大值为
TRUE
<代码>转换
这里也缺少一个列名。R是一个满是猫皮工具的棚子。我喜欢
replace
函数,所以我可能会在一些更简洁的情况下使用它。虽然,有人可能会争论清楚性。@MatthewPlourd我以前不知道这个函数,但我同意你的示例更具可读性,并且准确地介绍了OP所表达的内容。不知道是哪个。max;有了它,您还可以得到一个tapply解决方案:dFrame$GOAL@AdityaSihag使用
tapply
的缺点是它会假定数据是按
排序的
ave
避免了这种假设。@MatthewPlourd是否可以这样更改函数:如果组中有更多具有相同值的数字,它将选择列中的最后一个数字?例如,在“c”组中,将选择第二个值3(ID=11)。@MtS是的,请提交另一个问题,我将添加答案。@MatthewPlourde我提交问题,希望它更容易理解?:(
transform(data, GOAL= ave(value,group,
                          FUN=function(x)seq(x)==tail(which(x==max(x)),1))> 0)