删除最后一行不等于特定值x的所有列

时间:2018-03-24 23:15:08

标签: r dataframe subset

我有一个类似的数据框(DF):

DF <- rbind (c(10,20,30,40,50), c(21,68,45,33,21), c(11,98,32,10,30), c(50,70,70,70,50))

10 20 30 40 50
21 68 45 33 21
11 98 32 10 30
50 70 70 70 50

在我的场景中,我的x将是50.所以我的结果数据帧(resultDF)将如下所示:

10 50
21 21
11 30
50 50

我怎样才能在r中这样做?我尝试使用如下的子集,但它似乎没有像我期望的那样工作:

resultDF <- subset(DF, DF[nrow(DF),] == 50)

Error in x[subset & !is.na(subset), vars, drop = drop] : 

(下标)逻辑下标太长

2 个答案:

答案 0 :(得分:0)

我已经解决了。我的子设置是功能不准确。我使用以下代码来获得我需要的结果。

resultDF <- DF[, DF[nrow(DF),] == 50]

答案 1 :(得分:0)

subset()的问题仅与使用逻辑列向量(第三个arg,而不是第二个arg)调用它的语法有关。您可以使用subset()或纯逻辑索引。后者是recommended

帮助页面?subset告诉您其可选的第二个arg( &#39;子集&#39; )是逻辑 -vector,其可选的第三个arg( &#39; select&#39; )是一个逻辑 -vector:

subset: logical expression indicating elements or rows to keep:
          missing values are taken as false.

select: expression, indicating columns to select from a data frame.

所以你想用这个逻辑列向量来调用它:

> DF[nrow(DF),] == 50
[1]  TRUE FALSE FALSE FALSE  

有两种语法方法可以让subset()的第二个arg默认并传递第三个arg:

# Explicitly pass the third arg by name...
> subset(DF, select=(DF[nrow(DF),] == 50) )
# Leave 2nd arg empty, it will default (to NULL)...
> subset(DF, , (DF[nrow(DF),] == 50) )
     [,1] [,2]
[1,]   10   50
[2,]   21   21
[3,]   11   30
[4,]   50   50

第二种方式可能更可取,因为它看起来像通用行,col-indexing,并且也不要求你知道第三个arg的名字。

(作为助记符,在R和SQL术语中,了解&#39;选择&#39;隐含地表示&#39;列 - 索引&#39;和&#39;过滤&#39; /&#39 ;子集&#39;隐含地表示行索引&#39;或者在data.table术语中他们分别称为i-indices,j-indices。)