r - 在 R 中按组添加一列,计算行数直到第一个 1
问题描述
我有以下数据集:
test_df=data.frame(Group=c(1,1,1,1,2,2),var1=c(1,0,0,1,1,1),var2=c(0,0,1,1,0,0),var3=c(0,1,0,0,0,1))
团体 | 变量1 | 变量2 | 变量3 |
---|---|---|---|
1 | 1 | 0 | 0 |
1 | 0 | 0 | 1 |
1 | 0 | 1 | 0 |
1 | 1 | 1 | 0 |
2 | 1 | 0 | 0 |
2 | 1 | 0 | 1 |
我想为 var1-3 添加 3 列(out1-3),按组计算直到第一个 1 的行数,
如下所示:
团体 | 变量1 | 变量2 | 变量3 | 输出1 | 输出2 | 出3 |
---|---|---|---|---|---|---|
1 | 1 | 0 | 0 | 1 | 3 | 2 |
1 | 0 | 0 | 1 | 1 | 3 | 2 |
1 | 0 | 1 | 0 | 1 | 3 | 2 |
1 | 1 | 1 | 0 | 1 | 3 | 2 |
2 | 1 | 0 | 0 | 1 | 0 | 2 |
2 | 1 | 0 | 1 | 1 | 0 | 2 |
我使用了这个 R 代码,我为我的 3 个变量重复了它,而我的实际数据集不仅包含 3 列。但它不起作用:
test_var1<-select(test_df,Group,var1 )%>%
group_by(Group) %>%
mutate(out1 = row_number()) %>%
filter(var1 != 0) %>%
slice(1)
解决方案
如果您只有 3 个“输出”变量,那么您可以按如下方式创建三行
#1- Your dataset
df=data.frame(Group=rep(1,4),var1=c(1,0,0,1),var2=c(0,0,1,1),var3=c(0,1,0,0))
#2- Count the first row number with "1" value
df$out1=min(rownames(df)[which(df$var1==1)])
df$out2=min(rownames(df)[which(df$var2==1)])
df$out3=min(rownames(df)[which(df$var3==1)])
如果您有超过 3 列,那么最好创建一个循环,例如
for(i in 1:3){
df[paste("out",i,sep="")]=min(rownames(df)[which(df[,which(colnames(df)==paste("var",i,sep=""))]==1)])
}
推荐阅读
- r - 如何清除与 DT 链接的传单地图上的标记?
- asp.net-mvc - Azure Active Directory - 我们无法让您登录。请重试
- django - Django 错误:/new_bid/1 处的 ValueError 无法分配“1”:“Bid.listingid”必须是“列表”实例
- javascript - 尝试更改为 onChange 后,onEdit 触发器中断
- pine-script - Pinescript 没有在较短的时间范围图表上绘制更高分辨率的计算。怎么解决
- amazon-web-services - 在 GraphMappingConfig 中自动填充顶点属性
- sql - 找到那些在不同行中具有不同值的列?
- c# - 需要发送FIN/ACK
- python - 围绕另一个点旋转一个点会产生意想不到的结果
- wpf - 可以在没有 IoC 的情况下使用 MvvmCross Messenger 吗?