我有一个类似的数据框(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] :
(下标)逻辑下标太长
答案 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。)