2017-03-08 116 views
0

我希望通过一些列,子集,多列数据框,但使用的命令命令没有工作R中的多列数据框的排序和子集?

print(df[order(df$x) & df$x < 5,]) 

这并不查询结果排序。

要调试这个我生成测试数据帧与1列,但这种“简化”了意想不到的效果

df <- data.frame(x = sample(1:50)) 

print(df[order(df$x) & df$x < 5,]) 

,所以我觉得我已经转载了问题,但用简单的数据这并不查询结果排序。

打破的过程中先排序,然后子集化使我发现在这种情况下,顺序不产生数据框对象

df <- data.frame(x = sample(1:50)) 
ndf <- df[order(df$x),] 
print(class(ndf)) 

产生

[1] "integer" 

试图子集合成“整数“ndf对象使用数据帧语法,例如

print(ndf[ndf$x < 5, ]) 

明显生成错误:

Error in ndf$x : $ operator is invalid for atomic vectors. 

简化甚至进一步,我发现子集单独(未施加所述顺序功能)不生成数据帧对象

ndf <- df[df$x < 5,] 

class(ndf) 
[1] "integer" 

原来对于分离排序和子集的多列数据帧确实按预期工作

df <- data.frame(x = sample(1:50), y = rnorm(50)) 

ndf <- df[order(df$x),] 

print(ndf[ndf$x < 5, ]) 

,这解决了我原来的问题,但导致了两个进一步的问题:

  1. 为什么对象的类型返回的基础上,1列数据框测试用例,而不是一个数据帧如上所述? (我欣赏1列数据帧只包含一个矢量,但它仍然包裹在一个数据帧中?)
  2. 是否可以在一个步骤中对多列数据帧进行排序和子集化?
+2

data.frames进行只选择一列时自动简化到载体:http://stackoverflow.com/questions/21025609/how-do-i-extract-a-单列数据帧作为数据帧(可以通过drop = FALSE来防止)。子集和排序是两种不同的操作。你应该在两个逻辑步骤中完成它们(但可能需要一行代码)。 – MrFlick

回答

2

R中的在选择一列时自动简化为矢量。这是一种常见且有用的简化,在this question中有更好的描述。当然,你可以用drop=FALSE来防止这种情况。

子集和排序是两种不同的操作。你应该在两个逻辑步骤中完成它们(但可能需要一行代码)。这行不使有很大的意义中的R

df[order(df$x) & df$x < 5,] 

子集可以与行索引的向量(其order()回报)或布尔值(其<比较返回)来完成。混合它们(仅用&)并没有说明R应该如何执行子集。但是你可以打破了分为两个步骤,subset()

subset(df[order(df$x),], x < 5) 

这确实排序第一,然后子集。请注意,不再目录的条目特定地引用df的值,它将过滤来自重新排序的data.frame的数据。

这样的操作是许多人为了操作数据而使用dplyr库的原因之一。例如,这可以与R中

library(dplyr) 
dd <- data.frame(x = sample(1:50)) 
dd %>% filter(x<5) %>% arrange(x)