R根据另一列中的值为列赋值

R根据另一列中的值为列赋值,r,dplyr,R,Dplyr,我有一个这样的数据框 NAME DIST A 0 A 1 A 100 A 2 A 1 A 4 A 500 A 1 A 1

我有一个这样的数据框

 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="")
        }
    }
k=100){

k您可以这样做来创建新列:

df$NEWNAME=paste0("A", cumsum(0+df$DIST>=100))
我将您的数据用作
df
,并假设您的意思是优于或等于100:

编辑

如果需要在距离>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

为什么
cumsum()中的
0+
语句?这只是一个将真/假向量转换为0/1的技巧。事实上,这里甚至不需要它,因为cumsum会自动将逻辑转换为数字。谢谢。如果我想添加另一个约束,比如基于另一列,该怎么办?@user3910073当然,您只需添加另一个与和/或相结合的条件:
cumsum(df$DIST>=100&df$NAME==“A”)
例如,为什么第三个元素是
A
,第四个元素是
A2
?你能解释一下为什么第三行的新名称是A,而第七行的新名称是A3吗?这有点让人困惑,根据你对长度>3的描述,你需要粘贴A、A2、A3
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