【问题标题】:Removing rows from R data frame从 R 数据框中删除行
【发布时间】:2011-12-16 10:37:36
【问题描述】:

我有以下数据框:

> str(df)
'data.frame':   3149 obs. of  9 variables:
 $ mkod : int  5029 5035 5036 5042 5048 5050 5065 5071 5072 5075 ...
 $ mad  : Factor w/ 65 levels "Akgün Kasetçilik         ",..: 58 29 59 40 56 11 33 34 19 20 ...
 $ yad  : Factor w/ 44 levels "BAKUGAN","BARBIE",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ donem: int  201101 201101 201101 201101 201101 201101 201101 201101 201101 201101 ...
 $ sayi : int  201101 201101 201101 201101 201101 201101 201101 201101 201101 201101 ...
 $ plan : int  2 2 3 2 2 2 7 3 2 7 ...
 $ sevk : int  2 2 3 2 2 2 6 3 2 7 ...
 $ iade : int  0 0 3 1 2 2 6 2 2 3 ...
 $ satis: int  2 2 0 1 0 0 0 1 0 4 ...

我想从此数据框中删除 21 个特定行。

> a <- df[df$plan==0 & df$sevk==0,]
> nrow(a)
[1] 21

因此,当我删除这 21 行时,我将拥有一个包含 3149 - 21 = 3128 行的新数据框。我找到了以下解决方案:

> b <- df[df$plan!=0 | df$sevk!=0,]
> nrow(b)
[1] 3128

我的上述解决方案使用修改后的逻辑表达式(!= 代替 ==| 代替 &amp;)。除了修改原来的逻辑表达式之外,没有这 21 行,我怎样才能得到新的数据框呢?我需要这样的东西:

> df[-a,] #does not work

编辑(特别是对于不赞成投票的人,我希望他们理解我为什么需要一个替代解决方案):我要求一个不同的解决方案,因为我正在编写一个很长的代码,并且有各种变量分配(就像我的例子中的a's)在我的代码的各个部分。因此,当我需要在代码的推进部分中删除行时,我不想返回并尝试在a-like 表达式中编写逻辑表达式的逆。这就是为什么df[-a,] 对我更有用。

【问题讨论】:

  • -1 您的问题中包含一个解决方案。没有问题需要解决(因为问题目前的措辞)。
  • @RichieCotton:我的解决方案使用修改后的(不同的)逻辑表达式,最终得到我需要的结果;但我想看到的是如何从数据框中删除特定行。我在我的问题中包含了我的解决方案,因为我不想在答案中看到它。
  • 我在我的问题中添加了几行来解释我想知道的内容。
  • 我认为当df[df$plan!=0 | df$sevk!=0,] 似乎是正确的方法时,你为什么想要df[-a,] 这样的东西令人困惑。你能评论一下为什么在更大的范围内,像df[-a,] 这样的东西更可取吗?也许,从更大的角度来看,有一种方法可以避免这个问题。
  • 这是因为我正在编写很长的代码,并且在我的代码的各个部分中都有各种变量赋值(例如我的示例中的a)。因此,当我需要在代码的推进部分中删除行时,我不想返回并尝试在a-like 表达式中编写逻辑表达式的逆。这就是为什么df[-a,] 对我更有用。

标签: r dataframe rows


【解决方案1】:

你快到了。 'a' 需要是索引向量:

    df <- data.frame(plan=runif(10),sevk=runif(10))
    a <- c(df$plan<.1 | df$sevk < .1) # some logical thing
    df[-a,]

或者,使用您的数据:

    a <- c(df$plan==0 & df$sevk==0)
    df[-a,]

【讨论】:

  • 我用我的数据尝试了代码的最后两行,但它给出了错误的结果(3148 行而不是 3128 行)。 (顺便说一句,b[-a,] 应该是 df[-a,] 我猜)
  • 很抱歉,它与我上面的独立小示例一起使用,所以我猜你的数据发生了什么事情都在我头上
【解决方案2】:

您可以使用rownames 指定“互补”数据框。如果它们是数字行名,则更容易:

df[-as.numeric(rownames(a)),]

但更一般地,您可以使用:

df[setdiff(rownames(df),rownames(a)),]

【讨论】:

  • 当然这假设你有行名,OP 在这种情况下做了,但这不是一个通用的解决方案
【解决方案3】:

我不明白您为什么反对您的解决方案,但这是另一种方式。

which( df[df$plan==0 & df$sevk==0,], arr.ind=TRUE) ->killlist 
newdf <- df[-c(killlist[1,])] 

【讨论】:

    【解决方案4】:

    你在找subset()吗?

    dat <- airquality
    dat.sub <- subset(dat, Temp > 80 & Month < 10)
    
    dim(dat)
    dim(dat.sub)
    

    应用于您的示例:

    df.sub <- subset(df, plan != 0 & sevk != 0)
    

    【讨论】:

    • 这与我的解决方案相同:df[df$plan!=0 | df$sevk!=0,] 选择一个子集;不过还是谢谢。
    • 顺便说一句,&amp; 运算符必须是subset(df, plan != 0 &amp; sevk != 0) 中的| (OR) 运算符。
    【解决方案5】:

    只需否定你的逻辑下标:

    a <- df[!(df$plan==0 & df$sevk==0),]
    

    【讨论】:

      猜你喜欢
      • 2020-08-16
      • 2017-02-17
      • 2022-09-22
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多