0

我正在尝试删除 R 中 for 循环中的一些行。条件涉及将其与其下方的行进行比较,因此我无法在括号内进行过滤。

我知道我可以在指定常量时删除一行:dataframe[-2, ]. 我只想对变量做同样的事情:dataframe[-x, ]。这是完整的循环:

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, ]
  }
}

代码运行没有任何抱怨,但没有删除任何行(我知道应该删除一些行)。当然,如果我用常数对其进行测试,它可以正常工作:referrals[-2, ].

4

2 回答 2

0

使用您提供的所有信息,我相信这可能是一个不错的选择:

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, ]
于 2016-10-21T18:45:06.100 回答
0

您需要添加一个可重现的示例供人们使用。我不知道你的数据结构,所以我只能猜测这是否对你有用。由于评论中指出的原因,我不会使用循环。我会首先确定要删除的行,然后使用正常方式删除它们。考虑:

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-21T16:25:36.300 回答