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)))})))