order()使用包含空格的数据框列名称会产生意外结果

时间:2018-01-21 07:24:10

标签: r

我试图根据名为'信用卡使用情况的列在R中订购数据框。数据框的名称是mydata。以下没有逗号的命令会出现错误

  

newdata = mydata [订单('信用卡使用情况')]

但以下带逗号的命令可以正常工作

  

newdata = mydata [订单('信用卡使用情况'),]

我需要理解为什么我们需要逗号。请问有人能用简单的语言解释幕后发生的事情吗?

还有以下命令

  

mydata [订单('信用卡使用'),]

只给出第一行而不是整个数据帧。为什么呢?

2 个答案:

答案 0 :(得分:1)

为什么mydata[order('credit card usage'),]仅返回first row是一个棘手的问题。

, [之后使用的列名称是指列的值,否则它只是string

order('credit card usage')调用只会将string传递给它并将其排序并传递索引(即1)。因此: mydata[order('credit card usage'),]缩减为

mydata[1,]

=>这是1st row的{​​{1}}。

答案 1 :(得分:0)

MKR的答案解释了为什么OP获得了帖子中描述的结果。在这里,我们将解释如何处理名为credit card usage的列以正确排序整个数据框。

一般来说,不建议在R中使用包含空格的列名,因为它经常会导致OP遇到的意外结果。

要在名称中包含空格的数据框中使用列,必须使用提取运算符的[[形式。我们将用一些示例数据来说明......

set.seed(95014123)
mydata <- data.frame(matrix(round(runif(100)*1000,0),nrow=50))
names(mydata) <- c("credit card usage","value")
head(mydata)
head(mydata[order(mydata[["credit card usage"]]),])

...和输出:

> set.seed(95014123)
> mydata <- data.frame(matrix(round(runif(100)*1000,0),nrow=50))
> names(mydata) <- c("credit card usage","value")
> head(mydata)
  credit card usage value
1               795   217
2               816   613
3               342   323
4               126   751
5               618   780
6               625   529
> head(mydata[order(mydata[["credit card usage"]]),])
   credit card usage value
47                25   109
44                81   534
18                91   985
31                99   931
19               109   190
4                126   751
> 

可以通过gsub()函数替换带下划线的空格,这将使后者在后续函数中使用提取运算符的$形式。

# replace spaces with underscores
names(mydata) <- gsub(" ","_",names(mydata))
head(mydata[order(mydata$credit_card_usage),])

...和输出:

> # replace spaces with underscores
> names(mydata) <- gsub(" ","_",names(mydata))
> head(mydata[order(mydata$credit_card_usage),])
   credit_card_usage value
47                25   109
44                81   534
18                91   985
31                99   931
19               109   190
4                126   751
>