从R数据框中删除行

Meh*_*lar 22 r rows dataframe

我有以下数据框:

> 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 ...
Run Code Online (Sandbox Code Playgroud)

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

> a <- df[df$plan==0 & df$sevk==0,]
> nrow(a)
[1] 21
Run Code Online (Sandbox Code Playgroud)

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

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

我的上述解决方案使用经修饰的逻辑表达式(!=而不是==|代替&).除了修改原始逻辑表达式之外,如何在没有这21行的情况下获取新数据帧?我需要这样的东西:

> df[-a,] #does not work
Run Code Online (Sandbox Code Playgroud)

编辑(特别是对于downvoters,我希望他们理解为什么我需要一个替代解决方案):我要求一个不同的解决方案,因为我正在编写一个长代码,并且有各种各样的变量赋值(比如a我的例子中的各种)我的部分代码.因此,当我需要在代码的前进部分中删除行时,我不想回过头来尝试在a类似内部表达式中编写逻辑表达式的逆.这就是为什么df[-a,]对我来说更有用.

Jos*_*ich 15

只是否定你的逻辑下标:

a <- df[!(df$plan==0 & df$sevk==0),]
Run Code Online (Sandbox Code Playgroud)


Jam*_*mes 12

您可以使用它rownames来指定"互补"数据帧.如果它们是数字rownames它更容易:

df[-as.numeric(rownames(a)),]
Run Code Online (Sandbox Code Playgroud)

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

df[setdiff(rownames(df),rownames(a)),]
Run Code Online (Sandbox Code Playgroud)

  • `rownames(df)< - 1:nrow(df)` (5认同)

jth*_*zel 9

你在找subset()

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

dim(dat)
dim(dat.sub)
Run Code Online (Sandbox Code Playgroud)

适用于您的示例:

df.sub <- subset(df, plan != 0 & sevk != 0)
Run Code Online (Sandbox Code Playgroud)