R根据另一列中的值为列分配值

时间:2016-09-22 10:29:01

标签: r dplyr

我有一个像这样的数据框

 NAME       DIST    
 A          0           
 A          1           
 A          100         
 A          2           
 A          1           
 A          4           
 A          500         
 A          1           
 A          1           

我想要做的是找到一种创建新列NEWNAME的有效方法,这样如果DIST> 100它包含一个对所有前一行都相同的名称

 NAME       DIST     NEWNAME
 A          0           A
 A          1           A
 A          100         A
 A          2           A2
 A          1           A2
 A          4           A2
 A          500         A3
 A          1           A3
 A          1           A3

我使用for循环完成了它,但我正在寻找一种更有效的R风格解决方案。在我的代码下面使用for循环

k <- 0
for(l in 1:length(df$NAME)){
       if(df$DIST[l] >= 100){
                k <- k+1;
                df$NEWNAME[(l):length(df$NAME)] <- paste(df$NAME,k,sep="")
        }
    }

提前致谢

1 个答案:

答案 0 :(得分:1)

您可以执行此操作来创建新列:

df$NEWNAME=paste0("A", cumsum(0+df$DIST>=100))

我将您的数据用作df,并假设您的上级或等于为100:

df=data.frame("NAME"=rep("A", 9), "DIST"=c(0,1,100,2,1,4,500,1,1))

修改

如果您需要在距离> 100的行N + 1处开始新名称,您可以在以下情况之后执行此操作:

df$NEWNAME2 = lag(df$NEWNAME, n=1, default="A0")
####   NAME DIST NEWNAME NEWNAME2
#### 1    A    0      A0       A0
#### 2    A    1      A0       A0
#### 3    A  100      A1       A0
#### 4    A    2      A1       A1
#### 5    A    1      A1       A1