我正在尝试删除R中for循环中的一些行。条件涉及到将其与其下面的行进行比较,因此我不能在括号内进行过滤。
下面是完整的循环:
for (j in 1:(nrow(referrals) - 1)) {
k <- j + 1
if (referrals[j, "Client ID"] == referrals[k, "Client ID"] &
referrals[j, "Provider SubCode"] == referrals[k, "Provider SubCode"]) {
referrals[-k, ]
}
}代码运行时没有任何问题,但是没有删除任何行(我知道应该删除一些行)。
发布于 2016-10-22 00:25:36
您需要添加一个供用户使用的reproducible example。我不知道您的数据结构,所以我只能猜测这是否适用于您。出于评论中指出的原因,我不会使用循环。我将首先确定要删除的行,然后使用常规方法删除它们。考虑一下:
set.seed(4499) # this makes the example exactly reproducible
d <- data.frame(Client.ID = sample.int(4, 20, replace=T),
Provider.SubCode = sample.int(4, 20, replace=T))
d
# Client.ID Provider.SubCode
# 1 1 1
# 2 1 4
# 3 3 2
# 4 4 4
# 5 4 1
# 6 2 2
# 7 2 2 # redundant
# 8 3 1
# 9 4 4
# 10 3 4
# 11 1 3
# 12 1 3 # redundant
# 13 3 4
# 14 1 2
# 15 3 2
# 16 4 4
# 17 3 4
# 18 2 2
# 19 4 1
# 20 3 3
redundant.rows <- with(d, Client.ID[1:nrow(d)-1]==Client.ID[2:nrow(d)] &
Provider.SubCode[1:nrow(d)-1]==Provider.SubCode[2:nrow(d)] )
d[-c(which(redundant.rows)+1),]
# Client.ID Provider.SubCode
# 1 1 1
# 2 1 4
# 3 3 2
# 4 4 4
# 5 4 1
# 6 2 2
# 8 3 1 # 7 is missing
# 9 4 4
# 10 3 4
# 11 1 3
# 13 3 4 # 12 is missing
# 14 1 2
# 15 3 2
# 16 4 4
# 17 3 4
# 18 2 2
# 19 4 1
# 20 3 3发布于 2016-10-22 02:45:06
使用您提供的所有信息,我相信这可能是一个很好的替代方案:
duplicated.rows <- duplicated(referrals)然后,如果您希望运行重复的结果:
referrals.double <- referrals[duplicated.rows, ]但是,如果您希望运行非重复结果:
referrals.not.double <- referrals[!duplicated.rows, ]如果你喜欢一步一步来(也许你会感兴趣):
duplicated.rows.Client.ID <- duplicated(referrals$"Client ID")
duplicated.rows.Provider.SubCode <- duplicated(referrals$"Provider SubCode")
referrals.not.double <- referrals[!duplicated.rows.Client.ID, ]
referrals.not.double <- referrals.not.double[!duplicated.rows.Client.ID, ]https://stackoverflow.com/questions/40179912
复制相似问题