Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
r中显式行的行号_R_Dataframe_Dplyr_Row Number - Fatal编程技术网

r中显式行的行号

r中显式行的行号,r,dataframe,dplyr,row-number,R,Dataframe,Dplyr,Row Number,我需要获取在id上分组的显式行的行号。假设dataframe(df)如下所示: id a b 3 2 NA 3 3 2 3 10 NA 3 21 0 3 2 NA 4 1 5 4 1 0 4 5 NA 我需要再创建一列,该列将给出行号序列,不包括b==0的情况 期望输出: id a b row 3 2 NA 1 3 3 2 2 3 10 NA 3 3

我需要获取在id上分组的显式行的行号。假设dataframe(df)如下所示:

 id  a   b 
 3   2   NA
 3   3   2
 3   10  NA
 3   21  0
 3   2   NA
 4   1   5
 4   1   0
 4   5   NA
我需要再创建一列,该列将给出行号序列,不包括
b==0
的情况

期望输出:

 id  a   b   row
 3   2   NA   1
 3   3   2    2
 3   10  NA   3
 3   21  0    -
 3   2   NA   4
 4   1   5    1
 4   1   0    -
 4   5   NA   2
我使用了dplyr,但没有达到同样的效果, 我的代码:

df%
分组依据(id)%>%
变异(行=行编号(id[b!=0]))

请建议一些更好的方法。

我建议使用
data.table
包,因为它在子集上具有很好的操作能力,从而避免了低效的操作,例如
ifelse
或评估整个数据集。另外,最好将向量保持在数值类中(用于将来的操作),因此
NA
可能比
-
(字符)更可取,下面是一个可能的解决方案

library(data.table)
setDT(df)[is.na(b) | b != 0, row := seq_len(.N), by = id]
#    id  a  b row
# 1:  3  2 NA   1
# 2:  3  3  2   2
# 3:  3 10 NA   3
# 4:  3 21  0  NA
# 5:  3  2 NA   4
# 6:  4  1  5   1
# 7:  4  1  0  NA
# 8:  4  5 NA   2


这里的想法是只对
为.na(b)|b!=0
并生成每个组大小的序列(
.N
),同时就地更新
(使用
:=
)。默认情况下,所有其余的行都将分配有
NA
s。

mutate(row=ifelse(!is.NA(b),NA,cumsum(is.NA(b))))
mutate(row=replace(cumsum)(is.NA(b)),b==0,“-”
但您应该注意,在数字列中放置“-”将强制为字符。更新的问题,bTry中可能有一些数值,而不是
cumsum(b!=0 | is.na(b))
then@Khashaa您的代码没有生成所需的输出。Argh,返回到旧的
==
vs
%in%
vs连接区别(与上面评论中的Arun建议相关)。
library(data.table)
setDT(df)[is.na(b) | b != 0, row := seq_len(.N), by = id]
#    id  a  b row
# 1:  3  2 NA   1
# 2:  3  3  2   2
# 3:  3 10 NA   3
# 4:  3 21  0  NA
# 5:  3  2 NA   4
# 6:  4  1  5   1
# 7:  4  1  0  NA
# 8:  4  5 NA   2