【问题标题】:Attempting to remove a row in R using variable names尝试使用变量名删除 R 中的一行
【发布时间】:2017-03-03 22:59:19
【问题描述】:

我正在尝试删除 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, ]

【问题讨论】:

  • 只是运行referrals[-k,] 实际上并没有做任何事情。与 R 中的任何内容一样,如果您想更改对象,则需要对其进行 assign,即referrals &lt;- referrals[-k,]
  • ...尽管如此,我应该指出,即使修复了该部分,我也不清楚这段代码是否会按照您期望的方式运行。
  • 当您在一轮中删除行“k”时,在下一轮中,“j”将是您的最后一个“k”。因此,您的数据框不会以您在 for 循环范围中指定的相同行数结束,从而导致 subscript out of bounds 错误。所以,正如@joran 所说,你会考虑重新编写你的代码。

标签: r variables row-removal


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这个和我放的差不多。但尚不清楚讨论的两个变量是数据集中唯一的变量,因此尚不清楚duplicated() 是否适用于 OP。一个可重复的例子将有助于澄清事情。
    猜你喜欢
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多