首页 > 解决方案 > 在 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)

标签: rdataframedata-management

解决方案


如果您只有 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)])
}

推荐阅读