r中显式行的行号
我需要获取在id上分组的显式行的行号。假设dataframe(df)如下所示: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 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