我有以下数据框:
> 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
我的上述解决方案使用修改过的逻辑表达式(!=
代替==
和|
代替&
)。除了修改原始逻辑表达式之外,如何在没有这21行的情况下获取新数据帧?我需要这样的东西:
> df[-a,] #does not work
编辑(特别是对于downvoters,我希望他们理解我为什么需要替代解决方案):我要求一个不同的解决方案,因为我正在写一个长代码,并且有各种变量赋值(比如我的例子中的a
)代码的各个部分。因此,当我需要在代码的前进部分中删除行时,我不想回过头来尝试在a
内写出逻辑表达式的反转 - 就像表达式一样。这就是为什么df[-a,]
对我来说更有用的原因。
答案 0 :(得分:15)
只是否定你的逻辑下标:
a <- df[!(df$plan==0 & df$sevk==0),]
答案 1 :(得分:12)
您可以使用rownames
指定“互补”数据框。如果它们是数字rownames则更容易:
df[-as.numeric(rownames(a)),]
但更常见的是你可以使用:
df[setdiff(rownames(df),rownames(a)),]
答案 2 :(得分:9)
您在寻找subset()
吗?
dat <- airquality
dat.sub <- subset(dat, Temp > 80 & Month < 10)
dim(dat)
dim(dat.sub)
应用于您的示例:
df.sub <- subset(df, plan != 0 & sevk != 0)
答案 3 :(得分:2)
你快到了。 '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,]
答案 4 :(得分:0)
我不明白为什么你反对你的解决方案,但这是另一种方式。
which( df[df$plan==0 & df$sevk==0,], arr.ind=TRUE) ->killlist
newdf <- df[-c(killlist[1,])]