R-创建一列,其中只包含每个子集第一行的条目

R-创建一列,其中只包含每个子集第一行的条目,r,R,例如,如果我有以下数据: ID Value 1 2 1 2 1 3 1 4 1 10 2 9 2 9 2 12 2 13 我的目标是找到每个ID子集的最小值,我希望该数字位于ID组的第一行,而将其他行留空,这样: ID Value Start 1 2 2 1 2 1 3 1 4 1 10 2 9 9 2 9 2 12

例如,如果我有以下数据:

ID  Value   
1   2
1   2
1   3
1   4
1   10
2   9
2   9
2   12
2   13
我的目标是找到每个ID子集的最小值,我希望该数字位于ID组的第一行,而将其他行留空,这样:

ID  Value   Start
1   2       2
1   2       
1   3       
1   4       
1   10      
2   9       9
2   9       
2   12      
2   13      
我的第一反应是使用

A <- transform(A, INDEX=ave(ID, ID, FUN=seq_along)) ## A being the name of my data
A这里有一个解决方案:

within(A, INDEX <- "is.na<-"(ave(Value, ID, FUN = min), c(FALSE, !diff(ID))))

  ID Value INDEX
1  1     2     2
2  1     2    NA
3  1     3    NA
4  1     4    NA
5  1    10    NA
6  2     9     9
7  2     9    NA
8  2    12    NA
9  2    13    NA

在(A,INDEX中,您就快到了。我们只需要创建一个自定义函数,而不是
seq_
,并按
ID
分割
值(而不是
ID


您可以使用tapply one衬里实现这一点

df$Start<-as.vector(unlist(tapply(df$Value,df$ID,FUN = function(x){ return (c(min(x),rep("",length(x)-1)))})))

df$Start我一直回到这个问题,上面的答案对我帮助很大。
对于初学者也有一个基本的解决方案:


A$start你能给这个加一点解释吗?这让我头疼。@Sven Hohenstein:这个解决方案效果更好!我的“值”实际上是“日期”,格式为%m/%d/%Y(我不想完全依赖其他人)。另一种解决方案不适用于日期--它在某些日期上选择了错误的最小值和最大值。我认为这是因为R没有将我的数据识别为日期,而是在使用as.Date()之后错误接踵而至。然后我尝试了你的方法,所有的日期都是正确的。谢谢!@sebastian-c我添加了一个解释。感谢你的详细解释,这真的很有帮助。我不能让它在日期上工作得很好,虽然你可以在
first_min
中生成NAs向量后插入一行来缓解这个问题:
if(inherits(x,“Date”))nas您的意思是将其插入函数的末尾吗?@shirleywu不在末尾,介于:
nas这也适用于日期,并使空单元格为空!
transform(dat, INDEX=ave(Value, ID, FUN=first_min)) 

##   ID Value INDEX
## 1  1     2     2
## 2  1     2    NA
## 3  1     3    NA
## 4  1     4    NA
## 5  1    10    NA
## 6  2     9     9
## 7  2     9    NA
## 8  2    12    NA
## 9  2    13    NA
df$Start<-as.vector(unlist(tapply(df$Value,df$ID,FUN = function(x){ return (c(min(x),rep("",length(x)-1)))})))