Footsteps on my way !
perl/linux/测序分析

从R数据框中删除行

我有以下数据框架:

> 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’s)我的代码。因此,当我需要在代码的前进部分中删除行时,我不想回去尝试在a类似的表达式中写入逻辑表达式的反转。这就是为什么df[-a,]更适合我的原因。

—-下面是评论—

评论1:

您在寻找subset()吗?

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

适用于您的示例:

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

评论2:

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

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

评论3:

只是否定你的逻辑下标:

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

评论4:

你快到了。 '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,]

评论5:

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

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

但更一般地说,您可以使用:df[setdiff(rownames(df),rownames(a)),]

尊重他人劳动成果,转载请注明出处:Bluesky's blog » 从R数据框中删除行

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址